面我們來介紹如何通路動态連結庫中的C++類和資源。其具體操作步驟如下:
(1)建立一個基于對話框的工程,工程名稱為“AccessDll”。設計對話框資源如圖1所示。
圖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所示。
圖2 通路動态連結庫中的C++類和資源