DLL中的C ++异常处理

时间:2012-12-15 19:45:09

标签: c++ exception dll mingw thrift

我知道,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's类。如果ttransport->open()引发TTransportException异常(TTransportException继承自std::exception),则可能出现这种情况。

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

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

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

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

异常不是我的 - 所有都是用Apache Thrifts库编写的,所以我别无选择。

1 个答案:

答案 0 :(得分:1)

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

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

另一点是,即使你让它在MINGW上工作,它仍然可能导致堆栈展开问题,因为你需要MINGW for SEH不提供的编译器支持 - 一些细节见here。 / p>