使用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)