因專案需要,要在dll(專案要求規則dll,不允許用擴展dll)中封裝對話框,由主程式加載,以子視窗方式顯示,結果發現主程式在呼叫CDialog::Create時,this指標發生變化,后面再用到this指標,程式例外
主程式代碼如下
BOOL CtestDlg::OnInitDialog()
{
CDialog::OnInitDialog();
typedef int (*pFunGetUI)(void*& p_dlg,unsigned int& i_dlg_id);
HINSTANCE hExeIns=AfxGetInstanceHandle();
HINSTANCE hInstance =LoadLibrary( L"xxx.dll");
pFunGetUI getUI=(pFunGetUI)GetProcAddress(hInstance,"GetUI") ;
AfxSetResourceHandle(hInstance);
unsigned int dlg_id=0;
CDialog * pDlg=0;
getUI((void*&)pDlg,dlg_id);
if( pDlg->Create(dlg_id)==FALSE)//這一步成功了,但是主程式this指標發生了變化,好像記憶體溢位了
return FALSE;
AfxSetResourceHandle(hExeIns);
//后面如果使用this指標會例外
}
dll 匯出函式實作如下
CMyUI * myUI=0;//全域的變數,基于CDialog的
DLL_EXPORT_API int GetUI(void*& p_dlg, unsigned int & i_dlg_id)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
myUI= new CMyUI ;
//對話框指標:
p_dlg = myUI;
//對話框模板ID:
i_dlg_id = IDD_MYUI;
return 0;
}
uj5u.com熱心網友回復:
這個不是特例,我試著寫了很多個MFC的dll測驗,都會這樣,如果呼叫Create后不再做其它操作,頁面可以正常顯示,但是只要一使用this指標,或者訪問主程式的任何成員變數,都會例外uj5u.com熱心網友回復:
通讀MSDN中dll開發相關章節。uj5u.com熱心網友回復:
趙4老師,這個回復太籠統了吧,有刷分嫌疑呦uj5u.com熱心網友回復:
高手指教啊,upuj5u.com熱心網友回復:
你在OnInitDialog() 中用AfxSetResourceHandle(hInstance);其實這個函式是無效的,因為對話框資源已經加載進來了,這樣是更改不了資源,要想更換必須在還沒創建視窗是加載,可以在InitInstance()里,如果你想實作在dll里面顯示對話框,可以在dll里面做處理uj5u.com熱心網友回復:
模式已經被限定了,只能在主對話框中創建視窗,需求就是這樣的,需求方給的主程式可以加載這個dll,可惜看不到原始碼不知道加載邏輯,既然那個程式可以顯示,一點有方法可以實作uj5u.com熱心網友回復:
在主程式的InitInstance里試著加載了一下,還是有同樣的問題uj5u.com熱心網友回復:
DLL 中的對話框操作 應該在 AFX_MANAGE_STATE(AfxGetStaticModuleState()); 的作用域內因此建議 Create 也放在DLL 中進行
uj5u.com熱心網友回復:
那就奇怪了,客戶給的程式是如何實作的呢,好的我只能先試試在dll內Createuj5u.com熱心網友回復:
樓主應該按照上面這種方式做,而且在DLL里面最好提供一個全域的Show函式負責把對話框顯示出來,不要在Load DLL之后去構造再顯示,應該去呼叫DLL里你封裝的Show去顯示對話框
uj5u.com熱心網友回復:
同意
要么你就重寫一下Create,但是要在dll中
uj5u.com熱心網友回復:
趙4老師,這個回復太籠統了吧,有刷分嫌疑呦
還有比這更籠統的:
百度搜相關關鍵字。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/115492.html
標籤:進程/線程/DLL
上一篇:向資料庫中增加自定義列
