在做基於元件化MFC介面的開發時,需要把介面封裝到動態庫中。那麼如何實現呢?
工具/原料
Visual Studio 2010
方法/步驟
新建MFC DLL專案,專案名稱“MyDLL”,建立新解決方案,解決方案名稱為“MFCDLL”。
進入MFC DLL嚮導,選擇下一步,選擇“使用共享MFC DLL的規則DLL”。點選“完成”按鈕。
建立MFC DLL專案成功。執行時庫選擇:屬性-->c/c++-->程式碼生成-->執行庫 “多執行緒除錯 DLL (/MDd)”。
點選專案右鍵,新增MFC類。輸入類名:IHpDllWin,選擇基類:CDialog,點選完成。
動態庫將定義一個匯出函式,該函式返回匯出介面基類的指標。在IHpDllWin.cpp寫匯出介面:
// 定義匯出介面
extern "C" __declspec(dllexport) IHpDllWin* ShowDialog()
{
// 切記,此處需要加下面這行程式碼,不然對話方塊顯示不出來。
AFX_MANAGE_STATE(AfxGetStaticModuleState());
IHpDllWin *ph = new IHpDllWin;
ph->Create(IHpDllWin::IDD);
ph->ShowWindow(SW_SHOW);
return ph;
}
生成MyDLL.dll。MFC DLL程式建立完成。
新建MFC應用程式,名稱為MyMFC,解決方案名稱為MFCEXE。
進入MFC應用程式嚮導,點選下一步,應用程式型別選擇“基於對話方塊”,然後一直點選下一步,最後點選完成。
在對話方塊中拖入按鈕,雙擊該按鈕,進入程式碼編輯。
採用動態方式呼叫該動態庫,呼叫步驟如下:
1.載入動態庫
HINSTANCE m_hDll = LoadLibrary("MyDLL.dll");
if (NULL == m_hDll)
{
MessageBox("載入 MyDLL.dll 失敗");
}
2.獲取匯出函式指標
typedef IHpDllWin* (*hpDllFun)();
hpDllFun pShowDlg = (hpDllFun)GetProcAddress(m_hDll,"ShowDialog");
if (NULL==pShowDlg)
{
MessageBox("DLL中函式尋找失敗");
return;
}
3.獲取匯出類物件指標
IHpDllWin* m_hpwin = pShowDlg();
獲取匯出視窗類指標,獲取了對該匯出視窗的控制。
把MyDLL.dll拷到目標工程的Debug目錄下,複製IHpDllWin.h到目標工程的目錄下。
新增IHpDllWin.h,右鍵,新增現有項,選擇IHpDllWin.h,新增。
在MyMFCDlg.cpp頭部加入#include "IHpDllWin.h",然後編譯生成exe。主介面完成。
執行。按“Ctrl+F5”執行,執行結果如圖。
注意事項
因為IHpDllWin.h是自動生成的,裡面IDD=IDD_IHPDLLWIN的IDD_IHPDLLWIN會出現未定義,進行修改即可
本例子為簡單的呼叫MFC DLL,沒有其他功能,只是一個點選按鈕然後彈出另一個DLL的對話方塊。