DLL 支持MFC 沒有DLLMAIN函數
睿豐德科技 專注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是一個宏,其原型為:
該宏用于將pModuleState設置為當前的有效模塊狀態。當離開該宏的作用域時(也就離開了pModuleState所指向棧上對象的作用域),先前的模塊狀態將由AFX_MODULE_STATE的析構函數恢復。
方法二 在DLL接口函數中使用:
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中間件 條碼系統中間層 物聯網軟件集成
它給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中間件 條碼系統中間層 物聯網軟件集成