MSVC6如何处理来自extern "C"函数的异常?

5
我正在处理一个使用Visual Studio 6编写的应用程序(我知道,很遗憾),该应用程序使用LoadLibraryGetProcAddress调用DLL中的函数。新代码无法在VC6中编译,需要更高版本的编译器。DLL有几个函数用于构造C++对象,然后VC6程序通过抽象类使用该对象。

通常情况下,这很好用,但当GetProcAddress检索到的函数抛出异常时会遇到问题,即使在DLL内部捕获异常也是如此。我注意到,当抽象类的方法抛出异常时,这种情况不会发生。在这种情况下,一切正常运作。

我做错了什么? 如何使VC6生成能够正确处理异常的代码?

编辑:以下是导致程序崩溃的函数示例:

extern "C" __declspec(dllexport) Box* getBox(const char* addr)
{
    try {
        return createBox(addr);
    } catch (std::exception& ex) {
        LOG_ERROR("Open failed: " << ex.what());
        return 0;
    } catch (...) {
        LOG_ERROR("Error while opening.");
        return 0;
    }
}

2
所有模块是否都在使用同一个msvc运行库实例? - David Heffernan
2
他们不是,这就是问题所在。 - Hans Passant
@Brian,你的DLL中是否有catch all handlers?我们能否看到一个不捕获异常的这样的处理程序的示例。 - David Heffernan
1
我假设迁移到较新的VC++版本不是一个选项? :( - Axel Gneiting
你最终找到解决方法或变通之法了吗?您认为升级到VS2012会解决这个问题吗? - BigMacAttack
显示剩余4条评论
1个回答

1

你不能这样跨编译器版本继承。它几乎可以工作,但异常和其他一些内容会变得混乱。


1
这就是为什么我总是说,如果你的dll要长期存在,你应该将公共接口限制在C而不是C++中。 - rodrigo
1
这里的问题不在于接口。问题在于 DLL 内部的异常导致程序在异常被捕获之前中止。这些异常并不意味着要跨越 DLL 边界,它们应该完全在 DLL 代码内部抛出和捕获。 - Brian
问题在于ABI兼容性已经以一种令运行时困惑的方式被破坏了。 - Joshua

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接