【问题标题】:Implementing the CLR into old MFC/Win32 DLL and hosting DLL into MFC/Win32 Application将 CLR 实现到旧的 MFC/Win32 DLL 中并将 DLL 托管到 MFC/Win32 应用程序中
【发布时间】: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


【解决方案1】:

结合 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 中做同样的事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-21
    • 1970-01-01
    • 1970-01-01
    • 2011-05-29
    相关资源
    最近更新 更多