c++ - 在旧 MFC/Win32 应用程序上使用 C++ 互操作时遇到错误

标签 c++ winapi mfc c++-cli clr

我继承了一个旧的 MFC/Win32 C++ 应用程序,它的源代码我不应该编辑。

此 MFC 应用程序需要承载旧的 MFC/Win32 C++ DLL。此 DLL 还尝试通过混合模式包装器对托管 C++/CLI DLL 进行函数调用。我知道这听起来有点令人困惑,所以这是我的意思的图表:

Old MFC/Win32 Application (NO CLR)

    ---> Hosting old MFC/Win32 DLL (NO CLR)

                 ---> Making function calls to Mixed-Mode wrapper (CLR)

                              ---> Sending function calls to C++/CLI DLL (CLR)

我目前的问题是,当我尝试装载 C++/CLR 包装器类的对象时,比如说 WrapperClass WC;,MFC/Win32 应用程序遇到“未处理的异常”。

我觉得我可能需要以某种方式在单独的进程中托管 CLR,以便能够制作对象。这是正确的想法吗?还是我在这里完全不正常?

代码编译时,这只发生在运行时。

有什么想法吗?

这是我尝试运行的代码示例:

MFC/Win32 DLL

#include "WrapperClass.h"

BOOL Test::bTest() //This function is called elsewhere within MFC/Win32 DLL
{
    DWORD dwTest;

    WrapperClass WC; //Unhandled exception here!

    return WC.FunctionToCall(dwTest); //FunctionToCall is a BOOL
}

混合模式包装类

BOOL WrapperClass::FunctionToCall(DWORD dw)
{
    GCHandle h = GCHandle::FromIntPtr(IntPtr(m_impl)); //m_impl def'd as void *
    CPPCLIClass^ CCC = safe_cast<CPPCLIClass^>(h.Target);

    return (BOOL)CCC->FunctionToCall(dw);
}

C++/CLI DLL

bool CPPCLIClass::FunctionToCall(UInt32 ui32)
{
    if (ui32 == 42)
    {
        return true;
    }
}

更新: 我已经设法从程序中哄骗出一个真正的异常(exception)。我现在收到一个 System.IO.FileNotFound 异常,其中包含以下附加信息:

An unhandled exception of type 'System.IO.FileNotFoundException' occured in 
Unknown Module.

Additional information: Could not load file or assembly 'CPPCLIProject,
Version=1.0.4351.29839, Culture=neutral, PublicKeyToken=null' or one of its 
dependencies. The system cannot find the file specified.

这有什么意义吗?我知道它显然找不到 CPPCLIProject(注意:这不是包装器项目),但是如果我从混合模式包装器链接到 .lib 文件,那我怎么会不收到链接器错误呢?

最佳答案

您确定 WrapperClass::FunctionToCall() 的实现没有抛出异常吗?看起来您正在缓存 CLR 对象的内存位置,然后尝试调用其成员之一。我认为 CLR 可以自由移动对象,因此您可能正在尝试使用已移动的对象。

如果您将 WrapperClass::FunctionToCall() 的实现更改为一些简单的东西(即创建一个 CLR 对象,调用一个成员函数),您是否仍然会遇到相同的未处理异常?

更新:哪个类在 CPPCLIProject - CPPCLIClass 中?假设这个项目代表 C++/CLI DLL,听起来好像它在需要调用您的类时找不到加载它的程序集。

相对于应用程序的其余部分,此程序集在磁盘上的什么位置?如果你的根 EXE 是非托管的(听起来是这样,因为它是 MFC/Win32),那么 CLR 会在 EXE 的目录和 GAC 中查找以加载程序集(我不认为它在路径中查找,但我对此并不肯定)。

因此,如果 CPPCLIProject 与 EXE 不在同一目录中,那可能是您的问题。

关于c++ - 在旧 MFC/Win32 应用程序上使用 C++ 互操作时遇到错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8331825/

相关文章:

c++ - IEEE 754 float 学运算

c++ - 获取/释放与顺序一致的内存顺序

windows - vbscript 中的 CommonAppData

c++ - 删除 Visual C++ 菜单栏

c++ - 如何找到目录下的所有文件夹

c++ - 如何在 VC10 中跨 DLL 边界使用具有静态数据成员的模板化类

c++ - 句柄类和赋值运算符

c++ - Windows map 文件系统

C++如何控制LoadLibrary API的Image Base

c++ - 如何在 mfc sdi 主窗口中添加编辑框和按钮?