0

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

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

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

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

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

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

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

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

例外不是我的——全部都是在 Apache Thrifts 库中编写的,所以我别无选择。

4

1 回答 1

1

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

有一些努力通过和/或库添加对SEH的支持。这些并不是真正的生产质量,它更像是“阿尔法代码”......所以我会避免在生产中未经彻底测试(并且很可能进行一些修改)的情况下使用它们......

另一点是,即使你让它在 MINGW 上工作,它仍然可能导致堆栈展开问题,因为为此你需要 MINGW 不为 SEH 提供的编译器支持 - 一些详细信息请参见此处

于 2012-12-15T22:33:25.770 回答