我知道,Stackoverflow有很多类似的问题。但是没有答案能解决我的问题。

我正在创建以这种方式导出某些功能的DLL:

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


我在Windows XP上使用MinGW 4.4。 init()中有一些例外,因为我使用的是Apache Thrift,并且有类似ttransport->open()的代码,其中ttransportboost::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库编写的,所以我别无选择。

最佳答案

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

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

另一点是,即使您在MINGW上使用它也可能会导致堆栈展开问题,因为为此您需要MINGW for SEH不提供的编译器支持-有关详细信息,请参见here

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

10-13 08:19