訪問動態鏈接庫中的C++類和資源
睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接
面我們來介紹如何訪問動態鏈接庫中的C++類和資源。其具體操作步驟如下:
(1)創建一個基于對話框的工程,工程名稱為“AccessDll”。設計對話框資源如圖1所示。
.jpg)
圖1 對話框資源設計窗口
(2)定義一個名稱為CTextDlg的抽象類,因為需要訪問動態鏈接庫中的CTextDlg類,因此客戶端需要定義一個框架,即抽象類CTextDlg。
class CTextDlg //定義抽象類CTextDlg
{
public:
virtual void __stdcall ShowTextDlg(char* pchText) = 0; //定義純虛方法
};
(3)定義兩個函數指針,用于關聯動態鏈接庫中的全局函數。
typedef CTextDlg* (__stdcall *funGetTextDlg)(); //定義函數指針類型
typedef void ( __stdcall *funReleaseTextDlg)(CTextDlg* pTextDlg); //定義函數指針類型
(4)處理“確定”按鈕的單擊事件,訪問動態鏈接庫中CTextDlg類的方法,并加載動態鏈接庫中的位圖資源。
void CAccessDllDlg::OnOK()
{
HMODULE hMod = LoadLibrary("ClassDll.dll"); //加載動態鏈接庫
if (hMod != NULL) //判斷是否加載成功
{
//獲取動態鏈接庫中的GetTextDlg函數
funGetTextDlg GetTextDlg = (funGetTextDlg)GetProcAddress(hMod,"GetTextDlg");
funReleaseTextDlg ReleaseTextDlg= (funReleaseTextDlg)GetProcAddress(hMod,
"ReleaseTextDlg");//獲取動態鏈接庫中的ReleaseTextDlg 函數
if (GetTextDlg != NULL && ReleaseTextDlg != NULL) //判斷函數指針是否為空
{
CTextDlg* pTextDlg = GetTextDlg(); //調用動態鏈接庫中的方法,構造CTextDlg對象
pTextDlg->ShowTextDlg("編程詞典"); //訪問CTextDlg類的ShowTextDlg方法
ReleaseTextDlg(pTextDlg); //釋放pTextDlg對象
}
FreeLibrary(hMod); //卸載動態鏈接庫
}
//加載動態鏈接庫
HMODULE hRes = LoadLibraryEx("ClassDll",NULL,LOAD_LIBRARY_AS_DATAFILE);
if (hRes != NULL) //判斷是否加載成功
{
//加載動態鏈接庫中的位圖,其中2000為動態鏈接庫中的位圖資源ID值
HANDLE hBmp = LoadImage(hRes,MAKEINTRESOURCE(2000),IMAGE_BITMAP,0,0,0);
if (hBmp != NULL) //判斷加載位圖是否成功
{
m_BK.SetBitmap((HBITMAP)hBmp); //在空間中顯示位圖
}
FreeLibrary(hRes); //卸載動態鏈接庫
}
}
提示:為了獲取動態鏈接庫中的資源,我們需要使用LoadLibraryEx函數以數據文件的形式加載動態鏈接庫。
(5)運行程序,單擊“確定”按鈕,效果如圖2所示。
.jpg)
圖2 訪問動態鏈接庫中的C++類和資源RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
(1)創建一個基于對話框的工程,工程名稱為“AccessDll”。設計對話框資源如圖1所示。
.jpg)
圖1 對話框資源設計窗口
(2)定義一個名稱為CTextDlg的抽象類,因為需要訪問動態鏈接庫中的CTextDlg類,因此客戶端需要定義一個框架,即抽象類CTextDlg。
class CTextDlg //定義抽象類CTextDlg
{
public:
virtual void __stdcall ShowTextDlg(char* pchText) = 0; //定義純虛方法
};
(3)定義兩個函數指針,用于關聯動態鏈接庫中的全局函數。
typedef CTextDlg* (__stdcall *funGetTextDlg)(); //定義函數指針類型
typedef void ( __stdcall *funReleaseTextDlg)(CTextDlg* pTextDlg); //定義函數指針類型
(4)處理“確定”按鈕的單擊事件,訪問動態鏈接庫中CTextDlg類的方法,并加載動態鏈接庫中的位圖資源。
void CAccessDllDlg::OnOK()
{
HMODULE hMod = LoadLibrary("ClassDll.dll"); //加載動態鏈接庫
if (hMod != NULL) //判斷是否加載成功
{
//獲取動態鏈接庫中的GetTextDlg函數
funGetTextDlg GetTextDlg = (funGetTextDlg)GetProcAddress(hMod,"GetTextDlg");
funReleaseTextDlg ReleaseTextDlg= (funReleaseTextDlg)GetProcAddress(hMod,
"ReleaseTextDlg");//獲取動態鏈接庫中的ReleaseTextDlg 函數
if (GetTextDlg != NULL && ReleaseTextDlg != NULL) //判斷函數指針是否為空
{
CTextDlg* pTextDlg = GetTextDlg(); //調用動態鏈接庫中的方法,構造CTextDlg對象
pTextDlg->ShowTextDlg("編程詞典"); //訪問CTextDlg類的ShowTextDlg方法
ReleaseTextDlg(pTextDlg); //釋放pTextDlg對象
}
FreeLibrary(hMod); //卸載動態鏈接庫
}
//加載動態鏈接庫
HMODULE hRes = LoadLibraryEx("ClassDll",NULL,LOAD_LIBRARY_AS_DATAFILE);
if (hRes != NULL) //判斷是否加載成功
{
//加載動態鏈接庫中的位圖,其中2000為動態鏈接庫中的位圖資源ID值
HANDLE hBmp = LoadImage(hRes,MAKEINTRESOURCE(2000),IMAGE_BITMAP,0,0,0);
if (hBmp != NULL) //判斷加載位圖是否成功
{
m_BK.SetBitmap((HBITMAP)hBmp); //在空間中顯示位圖
}
FreeLibrary(hRes); //卸載動態鏈接庫
}
}
提示:為了獲取動態鏈接庫中的資源,我們需要使用LoadLibraryEx函數以數據文件的形式加載動態鏈接庫。
(5)運行程序,單擊“確定”按鈕,效果如圖2所示。
.jpg)
圖2 訪問動態鏈接庫中的C++類和資源RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成