解決擴展MFC DLL與主程序資源衝突問題

介紹這方面的文章不少,這裏僅僅簡明扼要提供代碼和一些說明。

 

在要到處的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僅適合做控件的擴展?

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章