tool_dlc.h 2.9 KB

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