为了比较方便地使用需要显式加载的DLL,提供两个类,分别封装DLL及DLL中提供的函数,做法:
- 定义封装类,使用一个HMODULE成员变量
- 构造函数中显式加载DLL,LoadLibraryEx函数
- 析构函数中释放,使用FreeLibrary函数
- 给一个GetModule()函数返回m_hModule。
具体做法
类的定义
1 class CPackDll 2 3 { 4 5 public: 6 7 CPackDll(void); 8 9 ~CPackDll(void); 10 11 HMODULE GetModule(); 12 13 14 15 private: 16 17 HMODULE m_hModule; 18 19 }; 20 21 //注意m_hModule的定义及使用
构造函数实现
1 CPackDll::CPackDll() 2 { 3 CString strPath = getPath(); 4 m_hModule = NULL; 5 #ifdef _WIN64 6 strPath += _T("\\x64\\CooBaseInterface.dll"); 7 m_hModule = LoadLibraryEx( strPath, NULL, LOAD_WITH_ALTERED_SEARCH_PATH); 8 #else 9 strPath += _T("\\Win32\\CooBaseInterface.dll"); 10 m_hModule = LoadLibraryEx( strPath, NULL, LOAD_WITH_ALTERED_SEARCH_PATH); 11 #endif 12 } 13 //注意LoadLibraryEx函数的使用
析构函数实现
1 CPackDll::~CPackDll() 2 { 3 if ( NULL != m_hModule ) { 4 FreeLibrary( m_hModule ); 5 m_hModule = NULL; 6 } 7 }
GetModule()函数
1 HMODULE CPackDll::GetModule() 2 { 3 return m_hModule; 4 }
封装DLL中的函数(使用类CPackDllFuncs)
- 使用了类CPackDllFuncs,对用到的Dll中的函数进行了封装。
- 包含"CMyDll.hpp"接口文件(提供了一个GetInterface()函数返回CInterface* )
- 定义了两个成员函数
- CPackDll* m_pDll;
- CInterface* m_pInterfaceFunc;
- 构造函数中
- 初始化m_pCPackDll (new)
- 获取hMod ,并判断是否为空
- 获取CPackDllFuncs pfnc,并判断是否为空
- 赋值m_pInterfaceFunc= pfnc();
- 注:使用了对MyDll接口中GetInterface函数指针的封装
- 析构函数中
- Delete m_pInterfaceFunc
- 将m_pInterfaceFunc置空
函数指针及构造函数写法
- 接口文件中提供的函数指针
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 extern "C" INTERFACE_EXPORT CInterface* GetInterface();
- typedef函数指针及构造函数
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 typedef CInterface* ( *CInterfaceFun )(); 2 CPackDllFuncs::CPackDllFuncs() 3 { 4 m_pPackDll = new CPackDll(); 5 HMODULE hMod = m_pPackDll->GetModule(); 6 if ( NULL == hMod ) { 7 return; 8 } 9 CInterfaceFun pfnc = ( CInterfaceFun )GetProcAddress( hMod, "GetInterface"); 10 if ( NULL == pfnc ) { 11 return; 12 } 13 m_pInterfaceFunc = pfnc(); 14 }
- 析构函数的写法
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 CPackDllFuncs::~CPackDllFuncs() 2 { 3 if (NULL != m_pPackDll ) { 4 delete m_pPackDll ; 5 m_pPackDll = NULL; 6 } 7 }