我有一个旧的MFC应用程序,我目前导入一个旧的MFC/Win32 DLL。
在这个旧的DLL中,我的任务是编写一堆多线程代码,我计划使用。net框架编写(因此需要CLR)。
我之前已经在这方面取得了突破,即使我可以让项目与CLR正确编译,我发现,一旦我尝试使用DLL的用户界面(在MFC中编写)加载DLL到MFC/Win32应用程序后,应用程序将崩溃,指出用户界面的问题。
这个DLL一直没有CLR工作,所以我知道它没有坏。
在我的项目中实现CLR的最佳方式是什么,即使它只适用于一个类?EDIT:我目前只能在我需要它的一个类上使用CLR构建代码,但是我加载DLL的应用程序在试图加载DLL中包含的用户界面时仍然崩溃。
EDIT2:我已经发现它在afxwin1.inl
中对afxCurrentResourceHandle
的断言失败。在做了更多的阅读之后,我有一种感觉,这与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: 0x043fd4fc {CWnd hWnd=0x002c0abe}
组合MFC和。net/CLR不太可能工作,除非你可以用CLR支持重新编译旧的MFC应用程序。即便如此,我还是强烈反对这么做;这两个框架不打算同时使用。请记住,即使不使用MFC,也只能使用一个GUI线程。
一个更好的解决方案是使用标准的MFC线程机制。这并不难;只需创建一个带有成员函数的新类,如下所示:static UINT Go(LPVOID pParam);
然后在你的类的其他地方调用AfxBeginThread(Go, this)
。将pParam转换为指向类的指针,然后开始在其上调用函数。你不需要使用任何花哨的东西来让这个策略在MFC中工作,你有所有标准的Win32/MFC/c++资源可用。告诉我你需要从。net中得到什么,我敢打赌我能找到一种方法在c++中或通过COM做同样的事情。