dlc.h 2.8 KB

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