環境:VS2015
程式一(dll):Win32 dll專案 使用MFC支持。帶一個對話框界面。
程式二(MFC對話框):有一個CStatic控制元件,計劃將dll界面創建在控制元件上。
例外情況:創建失敗,dll中界面創建處Create直接崩潰:

其他情況:對話框dlg.DoModel()模態形式創建成功!
對話框以非模態形式創建成功,可是界面是彈出的,不是想要的效果。
朋友都建議換成MFC共享DLL形式撰寫,但我相信微軟這個大的公司,這個使用場景應該被考慮到了,所以發帖看看有沒有大神知道解決對策的???
Win32 DLL專案設定如下。

匯出函式代碼如下:
//.h匯出
// 下列 ifdef 塊是創建使從 DLL 匯出更簡單的
// 宏的標準方法。此 DLL 中的所有檔案都是用命令列上定義的 TLVISIONMODULE_EXPORTS
// 符號編譯的。在使用此 DLL 的
// 任何其他專案上不應定義此符號。這樣,源檔案中包含此檔案的任何其他專案都會將
// TLVISIONMODULE_API 函式視為是從 DLL 匯入的,而此 DLL 則將用此宏定義的
// 符號視為是被匯出的。
#ifdef TLVISIONMODULE_EXPORTS
#define TLVISIONMODULE_API __declspec(dllexport)
#else
#define TLVISIONMODULE_API __declspec(dllimport)
#endif
// 此類是從 tlVisionModule.dll 匯出的
class TLVISIONMODULE_API CtlVisionModule {
public:
CtlVisionModule(void);
// TODO: 在此添加您的方法。
bool CreateView(CWnd *view);
};
//.cpp
//方式一 Create處崩潰
bool CtlVisionModule ::CreateView(CWnd *view)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
m_pDlgMain = new CDlgMain;
m_pDlgMain->Create(IDD_DIALOG_MAIN, view);//崩~~
m_pDlgMain->ShowWindow(SW_SHOW);
return true;
}
//方式二 運行正常,dll中界面是彈出式,不是我想要的
bool CtlVisionModule ::CreateView(CWnd *view)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
m_pDlgMain = new CDlgMain;
m_pDlgMain->Create(IDD_DIALOG_MAIN, NULL);//
m_pDlgMain->ShowWindow(SW_SHOW);
return true;
}
除錯界面,一大堆指標,看不明白:
uj5u.com熱心網友回復:
問題解決,還是自己這方面知識太欠缺
:采用HWND傳遞
//.h定義
CWnd m_pwnd;//這個不能定義到CreateView函式中,函式結束會崩
//.cpp代碼修改如下
bool CCamController::CreateView(HWND hwnd)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
m_pDlgMain = new CDlgMain;
m_pwnd.Attach(hwnd);
m_pDlgMain->Create(IDD_DIALOG_MAIN, &m_pwnd);
m_pDlgMain->ShowWindow(SW_SHOW);
return true;
}
uj5u.com熱心網友回復:
DLL 介面中不宜使用MFC類/類指標做引數, 不同的編譯器將產生不一樣的結果最好是使用基礎變數型別,兼容性強
uj5u.com熱心網友回復:
坑踩得多了就成專家了
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/15239.html
標籤:進程/線程/DLL
