<menu id="w8yyk"><menu id="w8yyk"></menu></menu>
  • <dd id="w8yyk"><nav id="w8yyk"></nav></dd>
    <menu id="w8yyk"></menu>
    <menu id="w8yyk"><code id="w8yyk"></code></menu>
    <menu id="w8yyk"></menu>
    <xmp id="w8yyk">
    <xmp id="w8yyk"><nav id="w8yyk"></nav>
  • 網站首頁 > 物聯資訊 > 技術分享

    DLL 支持MFC 沒有DLLMAIN函數

    2016-09-28 00:00:00 廣州睿豐德信息科技有限公司 閱讀
    睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接 如果使用VC編寫DLL時,需要MFC功能; 一般在源文件里就不能手動寫DLLMAIN函數了

    它給MFC集成了,\src\mfc\dllmodule.cpp
    打開它,里面有有一個DLLMAIN函數,根據源碼意思就可以看出來,

    這里截取的一點點代碼
    if (dwReason == DLL_PROCESS_ATTACH)
        {
            BOOL bResult = FALSE;

    #ifdef _AFXDLL
            // wire up resources from core DLL
            AfxCoreInitModule();
    #endif

            _AFX_THREAD_STATE* pState = AfxGetThreadState();
            AFX_MODULE_STATE* pPrevModState = pState->m_pPrevModuleState;

            // Initialize DLL's instance(/module) not the app's
            if (!AfxWinInit(hInstance, NULL, _T(""), 0))
            {
                AfxWinTerm();
                goto Cleanup;       // Init Failed
            }

            // initialize the single instance DLL
            CWinApp* pApp; pApp = AfxGetApp();////關鍵在這里了
            if (pApp != NULL && !pApp->InitInstance())///這里會調用 初始化函數
            {
                pApp->ExitInstance();///這也是退出時函數
                AfxWinTerm();
                goto Cleanup;       // Init Failed
            }

            pState->m_pPrevModuleState = pPrevModState;
    #ifdef _AFXDLL
            // wire up this DLL into the resource chain
            VERIFY(AfxInitExtensionModule(controlDLL, hInstance));
            TRY
            {
                CDynLinkLibrary* pDLL; 
                pDLL = new CDynLinkLibrary(controlDLL);
            }
            CATCH(CMemoryException, e)
            {
                DELETE_EXCEPTION(e);
                pApp->ExitInstance();
                AfxWinTerm();
                goto Cleanup;       // Init Failed
            }
            END_CATCH



    DLL_PROCESS_ATTACH

    DLL_PROCESS_DETACH

    這是莪們關心的,從上面代碼中可以看到,這里面MFC調用一個全局的CWinApp類的 初始化函數


    也就是說,現在寫一個類,讓它繼承CWinApp

    然后重載它的InitInstace 和ExitInstace就可以了

    在InitInstace時里面寫入所需要的代碼就可以了

    然后在聲明一個全局的變量,一定要是個全局變量

    當然這個類可以不用做任何事情,就提供初始化和退出時處理的函數



    如果在DLL 動態庫中導出全局變量
    extern int __decspec


    如果EXE中要使用DLL中的資源,因為DLL和EXE的資源ID很有可能會沖突,在函數第一行加入如下代碼可解決此問題

    AFX_MANAGE_STATE(AfxGetStaticModuleState());

    AFX_MANAGE_STATE是一個宏,其原型為: 

    AFX_MANAGE_STATE( AFX_MODULE_STATE* pModuleState )


    該宏用于將pModuleState設置為當前的有效模塊狀態。當離開該宏的作用域時(也就離開了pModuleState所指向棧上對象的作用域),先前的模塊狀態將由AFX_MODULE_STATE的析構函數恢復。

    方法二 在DLL接口函數中使用:

    AfxGetResourceHandle();

    AfxSetResourceHandle(HINSTANCE xxx);


    AfxGetResourceHandle用于獲取當前資源模塊句柄,而AfxSetResourceHandle則用于設置程序目前要使用的資源模塊句柄。

    我們將DLL中的接口函數ShowDlg改為:
    void ShowDlg(void)

    { 

    //方法2的狀態變更

    HINSTANCE save_hInstance = AfxGetResourceHandle(); 

    AfxSetResourceHandle(theApp.m_hInstance); 



    CDialog dlg(IDD_DLL_DIALOG);//打開ID為2000的對話框

    dlg.DoModal();

    //方法2的狀態還原

    AfxSetResourceHandle(save_hInstance);RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
    最近免费观看高清韩国日本大全