【问题标题】:C++ Windows DLL using try-catch block internally fails内部使用 try-catch 块的 C++ Windows DLL 失败
【发布时间】:2013-09-18 14:59:27
【问题描述】:

我正在尝试使用 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;
}

以及在 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 */

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

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

我使用以下代码编译 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 在内部解析所有依赖项,以使其自包含,那将是理想的。我该怎么做才能达到上述目标?

【问题讨论】:

  • 是不是说“抓到”?
  • 这是一条由 Microsoft CRT 生成的消息。在一个程序中混用不同版本的 CRT 很少有好的结果。
  • @doctorlove 不,它会立即使进程崩溃。 Hans,但是,DLL 和使用它的程序都是用同一个编译器编译的.. 还是应该这样吗?
  • 我做错了什么? 使用 mingw。但是不,请尝试删除 try/catch 以确认与崩溃有关。
  • 删除 try/catch 工作。此外,我这次编译的 dll 没有静态包含 libstdc++ 并且它有效!为什么这行得通?此外,如果我可以静态包含 libstdc++,那对我来说将是理想的。

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


【解决方案1】:

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

-static-libstdc++ -static-libgcc

为了它的工作。

【讨论】:

    猜你喜欢
    • 2011-08-22
    • 1970-01-01
    • 1970-01-01
    • 2017-09-30
    • 2010-10-31
    • 2019-02-27
    • 2012-10-16
    • 2016-02-01
    相关资源
    最近更新 更多