【发布时间】:2011-12-01 21:20:23
【问题描述】:
我有一个旧的 MFC 应用程序,我目前将一个旧的 MFC/Win32 DLL 导入其中。
在这个旧 DLL 中,我的任务是编写一堆多线程代码,我计划使用 .NET 框架编写这些代码(因此需要 CLR)。
我之前对此进行了破解,即使我可以使用 CLR 正确编译项目,但我发现在加载 DLL 后尝试使用 DLL 的用户界面(用 MFC 编写)进入 MFC/Win32 应用程序,应用程序会崩溃,指出用户界面有问题。
这个 DLL 在没有 CLR 的情况下一直可以工作,所以我知道它没有损坏。
在我的项目中实现 CLR 的最佳方式是什么,即使它只针对一个类?
编辑:我目前只能在我需要的一个类上使用 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 肯定不为空:pObject: 0x043fd4fc {CWnd hWnd=0x002c0abe}
【问题讨论】:
-
听起来很有趣...您有详细的错误信息给我们吗?你能给我们提供“CLR加载”代码吗?您是否尝试过运行一个仅加载 MFC/Win32 窗口和 CLR 的小示例应用程序?你能提供给我们这个示例应用吗?
-
你能分辨出你的dll是MFC扩展dll还是普通dll
-
这是一个扩展 DLL。它导入主机应用程序的 API 以允许主机应用程序启动其配置“页面”。 (至少我是这么理解的,只能在这个应用中使用)
标签: c++ mfc clr unmanaged managed