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

时间:2013-09-18 14:59:28

标签: c++ windows exception dll try-catch

我正在尝试使用gcc版本4.7.2创建一个Windows DLL,但是当我在内部使用Exceptions时,我遇到了问题。在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;
}

以及dllexport.h中的相关标题

#ifndef DLLEXPORT_H
#define DLLEXPORT_H

/* Define calling convention in one place, for convenience. */
#define ADDCALL __stdcall

/* Usually format is ADDAPI int ADDCALL Add(int a, int b)...
   but moving ADDCALL near ADDAPI works in gcc */

/* You should define BUILDING_DLL *only* when building the DLL. */
#ifdef BUILDING_DLL
  #define ADDAPI __declspec(dllexport) ADDCALL
#else
  #define ADDAPI __declspec(dllimport) ADDCALL
#endif

#ifdef  __cplusplus
extern "C" {
#endif

    ADDAPI int test();

#ifdef  __cplusplus
}
#endif

#endif  /* DLLEXPORT_H */

这个编译很好,但是当我尝试从链接到它的进程调用测试方法时,会返回以下错误:

此应用程序已请求Runtime以不寻常的方式终止它。

我使用以下代码编译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在内部解析了所有依赖项,那么它将是理想的,以便它是自包含的。我能做些什么来实现上述目标?

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题,看来我必须用下面的行编译客户端应用程序

-static-libstdc++ -static-libgcc

以使其有效。