2011-12-01 59 views
0

我有一箇舊的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:我發現它在afxCurrentResourceHandleafxwin1.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}

+0

聽起來有趣...你有詳細的錯誤信息給我們嗎?你能否給我們提供「CLR加載」代碼?你有沒有試過只運行一個小樣本應用程序只有MFC/Win32窗口和CLR加載?你可以提供我們這個示例應用程序? – oberfreak

+0

你可以告訴如果你的DLL我MFC擴展DLL或常規的DLL –

+0

這是一個擴展DLL。它導入主機應用程序的API以允許主機應用程序啓動其配置「頁面」。 (至少這是我的理解,它只能用在這個應用程序中) – Brutick

回答

0

結合MFC和.NET/CLR不太可能工作,除非你可以recompile the old MFC application with CLR support。即使那樣,我也會強烈勸阻它。這兩個框架不打算同時使用。請記住,即使不使用MFC,也只能使用一個GUI線程。

更好的解決方案是使用標準的MFC線程機制。這真的不難;只是做一個新的類,像這樣一個成員函數:

static UINT Go(LPVOID pParam); 

在你的類然後調用AfxBeginThread(Go, this)從別的地方。重新pParam指向你的類,然後開始調用它的功能。你不必使用任何奇怪的東西來使這個策略在MFC中工作,並且你已經獲得了所有標準的Win32/MFC/C++資源。告訴我你從.NET需要什麼,我敢打賭,我可以找到一種方法來在C++或COM中做同樣的事情。