天天看點

通路動态連結庫中的C++類和資源

面我們來介紹如何通路動态連結庫中的C++類和資源。其具體操作步驟如下:

(1)建立一個基于對話框的工程,工程名稱為“AccessDll”。設計對話框資源如圖1所示。

通路動态連結庫中的C++類和資源

圖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所示。

通路動态連結庫中的C++類和資源

圖2  通路動态連結庫中的C++類和資源

繼續閱讀