dlc.h 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. #ifndef AFUN_DLC_H
  2. #define AFUN_DLC_H
  3. #include <iostream>
  4. #include "aFunToolExport.h"
  5. #include "dlfcn.h" // CMake 处理 dlfcn.h 的位置
  6. /* 动态库工具(dlc): 处理动态库的使用 */
  7. /*
  8. * NEW_DLC_SYMBOL: 用于定义指定类型的symbol结构体
  9. * DLC_SYMBOL: 指定类型的symbol结构体名
  10. * GET_SYMBOL: 访问symbol成员的值
  11. * MAKE_SYMBOL: 生成一个symbol
  12. * COPY_SYMBOL: 拷贝一个symbol(拷贝其引用)
  13. * READ_SYMBOL: 在dlc中获取一个symbol
  14. * FREE_SYMBOL: 释放symbol
  15. *
  16. * openLibary: 打开动态库
  17. * freeLibary: 释放动态库
  18. * dlcExit: 释放所有动态库
  19. */
  20. namespace aFuntool {
  21. class DlcHandle;
  22. template <typename SYMBOL>
  23. class DlcSymbol;
  24. AFUN_TOOL_EXPORT void dlcExit();
  25. /**
  26. * DlcHandle: 动态库句柄
  27. * 注意: 仅能通过 openLibrary生成
  28. * 不需要 delete 释放 (自动管理释放)
  29. */
  30. class AFUN_TOOL_EXPORT DlcHandle {
  31. public:
  32. DlcHandle(const char *file, int mode) noexcept; // 仅 openLibary 可用
  33. inline DlcHandle(const DlcHandle &dlc_handle) noexcept;
  34. inline DlcHandle(DlcHandle &&dlc_handle) noexcept;
  35. inline ~DlcHandle() noexcept;
  36. inline DlcHandle &operator=(const DlcHandle &dlc_handle) noexcept;
  37. [[nodiscard]] inline bool isOpen() const;
  38. /**
  39. * 获得动态库中指定名字的符号
  40. * @tparam SYMBOL 符号类型
  41. * @param name 名字
  42. * @return 符号
  43. */
  44. template<typename SYMBOL>
  45. DlcSymbol<SYMBOL> getSymbol(const std::string &name);
  46. /**
  47. * 关闭动态库句柄
  48. */
  49. inline void close();
  50. inline int operator++(int);
  51. inline int operator--(int);
  52. static void dlcExit();
  53. class AFUN_TOOL_EXPORT Handle {
  54. friend class DlcHandle;
  55. public:
  56. explicit Handle(void *handle); // 仅 openLibary 可用
  57. Handle(const Handle &dlc) = delete;
  58. Handle &operator=(const Handle *dlc) = delete;
  59. ~Handle();
  60. [[nodiscard]] inline bool isOpen() const;
  61. /**
  62. * 获得动态库中指定名字的符号
  63. * @tparam SYMBOL 符号类型
  64. * @param name 名字
  65. * @return 符号
  66. */
  67. template<typename SYMBOL>
  68. DlcSymbol<SYMBOL> getSymbol(const std::string &name);
  69. int operator++(int);
  70. int operator--(int);
  71. private:
  72. void *handle_;
  73. int link_; // 引用计数
  74. struct Handle *next_;
  75. struct Handle *prev_;
  76. };
  77. private:
  78. class Handle *handle_;
  79. static Handle *dlc;
  80. };
  81. }
  82. #include "dlc.inline.h"
  83. #include "dlc.template.h"
  84. #endif //AFUN_DLC_H