介紹這方面的文章不少,這裏僅僅簡明扼要提供代碼和一些說明。
在要到處的MFC類加上AFX_EXT_CLASS,比如
class AFX_EXT_CLASS CMIVPToolDlg : public CDialog
即可形成到處類,用dumpbin查看發現幾乎導出了所有的MFC函數,暫時不管他。
在客戶端,也就是需要使用該MFC類的程序,加載方式,在工程中加入.lib庫以及庫目錄設定。
對對話框而言,調用方式有兩種:模態調用和動態創建。
兩種方式都會遇到資源ID號衝突的問題,解決辦法介紹如下:
1,模態調用
客戶端使用doModal函數啓動模態對話框,所以在導出類中重載該函數並修改如下:
INT_PTR CMIVPToolDlg::DoModal()
{
// TODO: Add your specialized code here and/or call the base class
HMODULE hDLL=GetModuleHandle(_T("MIVPToolbar.dll"));
HINSTANCE hEXE=AfxGetResourceHandle();
AfxSetResourceHandle((HINSTANCE)hDLL);
INT_PTR curp = CDialog::DoModal();
AfxSetResourceHandle(hEXE);
return curp;
}
其中MIVPToolbar.dll爲導出類生成的動態鏈接庫名字
這就解決了資源衝突問題。
2,動態創建
製作一個導出類的新的構造函數:
CMIVPToolDlg::CMIVPToolDlg(CWnd* pParent,UINT dType) // standard constructor
{
#ifndef _WIN32_WCE
EnableActiveAccessibility();
#endif
EnableAutomation();
HMODULE hDLL=GetModuleHandle(_T("MIVPToolbar.dll"));
HINSTANCE hEXE=AfxGetResourceHandle();
AfxSetResourceHandle((HINSTANCE)hDLL);
BOOL bCreated = CDialog::Create( IDD_FORMVIEW_TOOLDLG, pParent);
SUCCEEDED(bCreated);
AfxSetResourceHandle(hEXE);
}
在客戶端動態創建方式非常簡單,注意析構就可以了:
if( !m_toolbar1 )
{
m_toolbar1 = new CMIVPToolDlg(this,1);
}
m_toolbar1->ShowWindow(SW_SHOW);
3,通信
在擴展類中已經掌握了主類的指針,不成問題;同時,主類負責創建擴展類對象,擁有指針而且負責銷燬對象。
4,宗旨
代碼一樣、思想更是一樣。目的就是對面板進行封裝,協作開發方便。比如,我要求某個哥們給我做個什麼樣的界面,提供的功能很單一,與其他模塊的交互不多,那麼就讓他去起個exe工程,進行單獨的編寫和測試,然後我將他的工程通過這種方式做成dll庫的方式供我主程序調用。
5, 討論
這種方式的利弊還有待實踐,有哥們說擴展MFC DLL僅適合做控件的擴展?