gpt4 book ai didi

DLL 中的 C++ 异常处理

转载 作者:行者123 更新时间:2023-11-28 07:50:32 27 4
gpt4 key购买 nike

我知道,在 Stackoverflow 上有很多类似的问题。但是没有一个答案可以解决我的问题。

我正在创建以这种方式导出一些函数的 DLL:

extern "C" __declspec(dllexport) int init() { ... }

我在 Windows XP 上使用 MinGW 4.4。 init()有异常(exception),因为我使用 Apache Thrift,并且有类似 ttransport->open() 的代码, 其中ttransportboost::shared_ptr<TTransport> , 和 TTransport -- Apache Thrift 的类(class)。 ttransport->open() 时可能出现的情况抛出 TTransportException异常( TTransportException 继承自 std::exception )。

该异常使加载我的 DLL 的主机程序崩溃。宿主程序是第三个人写的,我没有宿主程序的代码。

因此,我在徘徊,为什么像这样的包装器方法无济于事(主机程序以同样的方式崩溃):

try
{
ttransport->open();
}
// or just catch(...)
catch (std::exception &e) // or, using TTransportException
{
return 42;
}

有人可以说我做错了什么吗?

异常不是我的——所有这些都是在 Apache Thrifts 库中编写的,所以我别无选择。

最佳答案

这只能通过 SEH 支持- 大多数 C/C++ 编译器为此提供 __try/__except/__finally ... MINGW 不是其中之一...

有一些努力来增加对 SEH 的支持通过macros和/或 library .这些并不是真正的生产质量,它更像是“alpha 代码”......所以我会避免在生产中没有经过彻底测试(很可能是一些修改)的情况下使用它们......

另一点是,即使你让它在 MINGW 上工作,它仍然可能导致堆栈展开问题,因为为此你需要编译器支持,而 MINGW 没有为 SEH 提供支持 - 一些细节参见 here .

关于DLL 中的 C++ 异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13895564/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com