标签: dlltool

如何在MinGW(-w64)中捕获延迟导入dll错误(缺少dll或符号)?

使用dlltool -y它可以为现有的.dll或.def文件创建延迟导入库。这似乎可以正常工作,直到没有相应dll的系统上需要dll为止(这对于延迟导入/加载的dll来说是预期的)。但是,我找不到有关如何捕获延迟加载期间生成的错误(缺少模块或缺少功能)的任何信息。

在MSVC上,您将使用__try {} __except (...) {}SEH异常处理,但是,这在MinGW上不可用(我也不知道dlltool使用哪种异常机制)。

常规try {} catch(...) {}也不起作用(应用程序崩溃与没有任何异常处理的方式相同)。

GDB输出也不是特别有用:

gdb: unknown target exception 0xc06d007e at 0x7fefccfaaad

Program received signal ?, Unknown signal.
0x000007fefccfaaad in RaiseException ()
   from C:\Windows\system32\KernelBase.dll
Run Code Online (Sandbox Code Playgroud)

如果我没记错的话,在RaiseException中发生未知异常似乎表明是SEH异常。

因此,问题是,有人能成功处理MinGW-w64中的延迟加载吗?

编辑:经过一些实验,我想出了以下解决方案:

extern "C" __declspec(dllexport) void foo(int);

#include <windows.h>
#include <csetjmp>
#include <stdexcept>
#include <memory>
#include <cstdio>

thread_local auto do_handler = true;
thread_local jmp_buf env;
LONG CALLBACK handler(PEXCEPTION_POINTERS e)
{
    if(do_handler)
    {
        // this flag is necessary to prevent a recursive …
Run Code Online (Sandbox Code Playgroud)

c c++ mingw mingw-w64 dlltool

5
推荐指数
0
解决办法
774
查看次数

标签 统计

c ×1

c++ ×1

dlltool ×1

mingw ×1

mingw-w64 ×1