【问题标题】:How can MSVC6 handle exceptions from extern "C" functions?MSVC6 如何处理来自外部“C”函数的异常?
【发布时间】:2011-11-21 10:00:09
【问题描述】:

我正在开发一个用 Visual Studio 6(我知道,FML)编写的应用程序,它使用 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;
    }
}

【问题讨论】:

  • 是否所有模块都使用相同的 msvc 运行时实例?
  • 他们不是,这就是问题所在。
  • @Brian 你有捕获 DLL 中的所有处理程序吗?我们能看到一个这样的处理程序没有捕获异常的例子吗?
  • @DavidHeffernan 我在上面发布了一个示例。您会注意到有一个包罗万象的处理程序。这是否存在并不重要。
  • 我认为迁移到较新的 VC++ 版本不是一种选择? :(

标签: c++ visual-studio exception


【解决方案1】:

你不能做这样的继承交叉编译器版本。它几乎可以工作,但异常和其他一些事情变得疯狂。

【讨论】:

  • 这就是为什么我总是说,如果你的 dll 寿命很长,你应该将公共接口限制为 C,而不是 C++。
  • 这里的问题不在界面上。问题是异常DLL 内部 导致程序在异常被捕获之前中止。异常并不意味着跨越 DLL 边界,它们将在 DLL 代码中被完全抛出和捕获。
  • 问题是 ABI 兼容性已被破坏,导致运行时混乱。
猜你喜欢
  • 1970-01-01
  • 2015-05-19
  • 2020-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-22
相关资源
最近更新 更多