我有一个旧的MFC应用程序,我目前将旧的MFC / Win32 DLL导入。
在这个旧的DLL中,我的任务是编写一堆多线程代码,我计划使用.NET框架编写代码(因此需要CLR)。
我之前已经解决了这个问题,即使我可以使用CLR正确编译项目,我发现只要我在加载DLL后尝试使用DLL的用户界面(用MFC编写)进入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肯定不是null:pObject: 0x043fd4fc {CWnd hWnd=0x002c0abe}
答案 0 :(得分: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中做同样的事情。