Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;在内部使用try-catch块的Windows DLL失败_C++_Windows_Exception_Dll_Try Catch - Fatal编程技术网

C++ C++;在内部使用try-catch块的Windows DLL失败

C++ C++;在内部使用try-catch块的Windows DLL失败,c++,windows,exception,dll,try-catch,C++,Windows,Exception,Dll,Try Catch,我正在尝试使用gcc版本4.7.2创建Windows DLL,但是在内部使用异常时,我会遇到问题。在DLL代码中,我抛出了在test()方法中发现的异常,该异常在同一方法中捕获。以下是main.cpp中的代码: #include <cstdlib> #include <windows.h> #include <iostream> #include "dllexport.h" using namespace std; ADDAPI int test() {

我正在尝试使用gcc版本4.7.2创建Windows DLL,但是在内部使用异常时,我会遇到问题。在DLL代码中,我抛出了在
test()
方法中发现的异常,该异常在同一方法中捕获。以下是main.cpp中的代码:

#include <cstdlib>
#include <windows.h>
#include <iostream>
#include "dllexport.h"

using namespace std;

ADDAPI int test()
{
    try
    {
        throw 2;
    }catch(...)
    {
        std::cout << "Caught";
        return 1;
    }
    return 0;
}

//Link to correct DllMain if C++ is used
#ifdef __cplusplus
extern "C"
#endif
BOOL APIENTRY DllMain(HINSTANCE hModule, DWORD  reason, LPVOID lpReserved)
{
    switch (reason)
    {
        case DLL_PROCESS_ATTACH:
        break;
        case DLL_THREAD_ATTACH:
        break;
        case DLL_THREAD_DETACH:
        break;
        case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}
这可以很好地编译,但是当我尝试从链接到它的进程调用测试方法时,返回以下错误:

此应用程序请求运行时以异常方式终止它。

我使用以下方法编译dll:

g++ -c main.cpp -O3 -DBUILDING_DLL
g++ -o mydll.dll main.o -shared -static-libgcc -static-libstdc++ -Wl,--add-stdcall-alias
此外,我使用
-lmydll
编译客户机应用程序。我知道从DLL抛出异常并在进程中捕获它们是有风险的,但是我没有这样做,因为所有异常都将在DLL内部处理

我做错了什么

编辑:


删除libstdc++到DLL的静态链接可以解决这个问题。但是,如果DLL在内部解析所有依赖项,以使其自包含,那么这将是理想的。我能做些什么来实现上述目标?

我也遇到了同样的问题,似乎我还必须用下面的代码来编译客户端应用程序

-static-libstdc++ -static-libgcc

为了让它工作。

它是否说“捕获”?这是由Microsoft CRT生成的消息。在一个程序中混合使用不同的CRT版本很少会有好的结果。@doctorlove不,它会立即使程序崩溃。然而,Hans,DLL和使用它的程序都是用同一个编译器编译的。。还是这样吗?我做错了什么?使用mingw。但是没有,请尝试删除try/catch以确认与崩溃有关。删除try/catch有效。此外,这次我编译了dll,没有静态地包含libstdc++并且它工作正常!为什么这样做有效?另外,如果我可以静态地包含libstdc++的话,这对我来说也是非常理想的。
-static-libstdc++ -static-libgcc