延迟加载 DLL 的约束

导入延迟加载有一些约束。

  • 不支持数据导入。 变通的办法是用 LoadLibrary(或者,如果知道延迟加载 Helper 已加载了 DLL,则用 GetModuleHandle)和 GetProcAddress 自己显式处理数据导入。

  • 不支持延迟加载 Kernel32.dll。 延迟加载 Helper 例程执行延迟加载时需要该 DLL。

  • 不支持转发的入口点绑定

  • 如果在延迟加载的 DLL 的入口点发生每个进程初始化,则 DLL 的延迟加载可能不会造成进程行为相同。 其他情况包括静态 TLS(线程本地存储区),它使用通过 LoadLibrary 加载 DLL 时不处理的 __declspec(thread) 来声明。 使用 TlsAllocTlsFreeTlsGetValueTlsSetValue 的动态 TLS 仍可在静态加载或者延迟加载的 DLL 中使用。

  • 初次调用静态(全局)函数后应,将其指针重新初始化为导入函数。 这是因为该函数指针在初次使用时将指向 thunk。

  • 目前还没有办法在使用正常导入机制时,只延迟加载 DLL 中的特定过程。

  • 自定义调用约定(比如在 x86 结构上使用条件代码)不受支持。 也无法在 RISC 计算机上的任何 Helper 例程或挂钩中使用浮点数据类型。 任何平台上都不保存浮点寄存器。 如果自定义 Helper 例程或挂钩例程使用浮点类型,则它们需要在具有浮点参数的寄存器调用约定的计算机上完全保存和恢复浮点状态。 如果在 Helper 函数中调用采用数值数据处理器 (NDP) 堆栈上的浮点参数的 CRT 函数,延迟加载 CRT DLL 时请小心谨慎。

请参见

概念

链接器的延迟加载 DLL 支持