我有一箇舊的MFC應用程序,我當前將一箇舊的MFC/Win32 DLL導入到。實現CLR到舊的MFC/Win32 DLL並將DLL宿主到MFC/Win32應用程序
在這個舊的DLL中,我一直負責編寫一堆使用.NET框架編寫的多線程代碼(因此需要CLR)。
我已經在此之前做了一些破解,即使我可以使用CLR正確編譯項目,我發現只要在加載完成後嘗試使用DLL的用戶界面(用MFC編寫) DLL到MFC/Win32應用程序中,應用程序將崩潰指向用戶界面的問題。
這個DLL一直沒有使用CLR,所以我知道它沒有被破壞。
在我的項目中實現CLR的最佳方式是什麼,即使它僅適用於一個類?我現在可以得到的代碼與CLR只建立在我需要它的一個類上,但應用程序我加載DLL到仍然崩潰後嘗試加載DLL中包含的用戶界面。
EDIT2:我發現它在afxCurrentResourceHandle
afxwin1.inl
上沒有斷言。在做更多的閱讀之後,我感覺這與MFC處於「共享DLL」而不是「靜態DLL」有關。這個斷言是否有解決方法?
_AFXWIN_INLINE HINSTANCE AFXAPI AfxGetResourceHandle()
{ ASSERT(afxCurrentResourceHandle != NULL);
return afxCurrentResourceHandle; }
EDIT3:我已經取得了進步,但還是未能斷言!顯然,在用戶界面中創建頁面的對象之前,必須使用AFX_MANAGE_STATE
宏來定義afxCurrentResourceHandle!
這裏是我的意思的例子:
CPropertySheet Sheet("Config"); //Assume this is defined
AFX_MANAGE_STATE(AfxGetStaticModuleStatus());
CConfigPage ConfigPage;
CTestPage TestPage;
//Now I am failing an assertion when trying to run the following code
if (Sheet.DoModal() == ID_OK)
{
//Do stuff...
}
目前現在失敗的說法是:
CObject* AFX_CDECL AfxStaticDownCast(CRunTimeClass* pClass, CObject* pObject)
{
ASSERT(pObject == NULL || pObject->IsKindOf(pClass));
return pObject
}
pObject肯定不爲空:pObject: 0x043fd4fc {CWnd hWnd=0x002c0abe}
聽起來有趣...你有詳細的錯誤信息給我們嗎?你能否給我們提供「CLR加載」代碼?你有沒有試過只運行一個小樣本應用程序只有MFC/Win32窗口和CLR加載?你可以提供我們這個示例應用程序? – oberfreak
你可以告訴如果你的DLL我MFC擴展DLL或常規的DLL –
這是一個擴展DLL。它導入主機應用程序的API以允許主機應用程序啓動其配置「頁面」。 (至少這是我的理解,它只能用在這個應用程序中) – Brutick