封装DLL及其中的函数(显式加载时)

it2022-05-09  35

为了比较方便地使用需要显式加载的DLL,提供两个类,分别封装DLL及DLL中提供的函数,做法:

定义封装类,使用一个HMODULE成员变量构造函数中显式加载DLLLoadLibraryEx函数析构函数中释放,使用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置空

函数指针及构造函数写法

接口文件中提供的函数指针 View Code 1 extern "C" INTERFACE_EXPORT CInterface* GetInterface();

 

typedef函数指针及构造函数 View Code 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 }

 

析构函数的写法 View Code 1 CPackDllFuncs::~CPackDllFuncs() 2 { 3 if (NULL != m_pPackDll ) { 4 delete m_pPackDll ; 5 m_pPackDll = NULL; 6 } 7 }

 

 

 

转载于:https://www.cnblogs.com/huan7550/archive/2013/03/18/2965796.html

相关资源:lisp 调用VLX函数模块

最新回复(0)