问题标签 [delay-load]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
700 浏览

python - Windows 中的延迟加载

我试图了解一些代码(直接从 PyCXX 改编)。它是一个多平台 C++ Python 包装器。

编辑:这里的原始代码。

它似乎迎合了一些只存在于 Windows 中的特殊现象:

我将在下面给出完整的文件列表,它很长。

这个 PY_WIN32_DELAYLOAD_PYTHON_DLL 令牌在 CPython 中不存在,它也没有在 PyCXX 中定义。因此我只能想象 PyCXX 打算将它作为可选的编译器标志提供。

我想知道的是:它的目的是什么?它在解决什么问题?为什么这种机制甚至存在?

也许熟悉Windows编程的人可以从代码中弄清楚?

我想知道它正在解决的问题是否仍然存在于现代 Windows 中,因为代码已经超过 15 年了。

关键问题是:我可以删除它,还是用更清洁的东西代替它?

我非常想把它剪掉;但它在现代 Windows 环境中仍然有一些有用的用途吗?

代码:

0 投票
1 回答
570 浏览

windows - 延迟加载的 DLL 对避免链接特定函数有用吗?

考虑以下代码,它需要调用User32.dll.

如果我没记错的话,这个程序在WinXP下会启动失败,因为在XP下AddClipboardFormatListener不存在User32.dll

解决此问题的一种方法不是AddClipboardFormatListener直接调用,而是自己获取指向它的指针:
GetProcAddress(GetModuleHandle("User32.dll"), "AddClipboardFormatListener").

但是,如果我指示链接器延迟加载User32.dll...

  1. 这是否会避免在 XP 下加载该特定功能,以便我不需要调用GetModuleHandleand GetProcAddress
  2. 当只需要延迟加载几个函数时,是否建议延迟加载 DLL?

的情况User32.dll在第二点上特别引人注目,因为程序中使用的大多数函数都知道存在于所有 Windows 版本的该 DLL 中。
我猜想在加载时链接比在运行时更有效,因为后者需要在每次函数调用之前进行额外检查。
但我只是猜测,因此问题。

0 投票
1 回答
391 浏览

c++ - 延迟加载crypto++ cryptopp.dll

cryptlib.libCrypto++ 库通过针对和编译来支持后期绑定cryptopp.lib。这需要使用cryptopp.dll. 当尝试延迟加载此 dll 时,/DELAYLOAD:cryptopp.dll会导致链接错误,由于需要导入,因此无法延迟加载。

作为示例,请参见以下代码:

这会导致以下链接错误:

是否有人已经成功延迟加载cryptopp.dll

0 投票
1 回答
810 浏览

c++ - 加载图像时,PE文件部分是否可以相对于基地址在内存中移动?

我正在尝试访问Import Address Table任意进程中延迟加载的函数地址。

我的假设是这样的:

首先,我需要查看它相对于基地址在图像本身中的位置:

这是 PE 标头中查找的一些缩写版本。我删除了大多数错误检查以使其可读:

然后我将其构建TargetProc.exe为一个简单的控制台项目,并WTSAPI32.dll设置延迟加载:

在此处输入图像描述

TargetProc.exe只有这个代码:

然后我运行我的第一个项目,它为我提供了该WTSOpenServerW函数的 IAT 条目偏移量,TargetProc.exe即:

我可以用调试器验证:

在此处输入图像描述


然后第二阶段是检查它。

所以如果我TargetProc.exe在 Visual Studio 中运行我的,我可以首先得到它的基地址(恰好是0x890000):

在此处输入图像描述

然后我可以单步执行该WTSOpenServerW函数以查看其 IAT 条目的位置:

在此处输入图像描述

跳过那个跳转,它只在调试器构建中添加到这里。

这就是它实际从指令WTSOpenServerW的 IAT 条目中读取函数地址的地方:jmp

在此处输入图像描述

我在 address 获得了它的 IAT 条目0x008AB070,它恰好位于0x1B070与基地址(即0x008AB070- 0x890000= 0x1B070)的字节偏移处,而不是我在上面计算的预期0x7670

那么我在计算中做错了什么?

PS。PE头结构参考1参考2

0 投票
0 回答
167 浏览

c++ - 在 C++ 代码中延迟加载 C 库

我目前正在尝试将 ffmpeg 库(在 C 中)加载到我的 C++ 项目中。该库由头文件、.lib 文件和 .dll 文件组成,我成功加载并使用了所有这些文件。但是,我们的项目非常希望延迟加载这些 dll 文件,这就是我失败的地方。

它归结为:

  • 当我在不参考任何库的 dll 函数的情况下构建项目时,它运行正常,并且我看到(通过我的日志)所有 dll 都在我明确获取它们的 DLL 句柄的地方正确加载。
  • 当我构建项目并包含对 dll 的函数调用时,可执行文件 simple 无法加载,因为它缺少“xx.dll”。这是在函数调用完成之前。IE:只需在我的代码中调用 dll 函数,程序似乎会在启动时尝试加载它。
    • 当我在我的程序可执行文件旁边手动添加 dll 时,它在两种情况下都运行良好,但不希望将它们放在我的可执行文件旁边。

有什么明显的我遗漏或做错了吗?

谢谢!

0 投票
1 回答
814 浏览

c++ - 为什么某些延迟加载 DLL 会立即用 FFMPEG 卸载?

我已将 ffmpeg 构建为 DLL 并将它们链接到我的应用程序,当 DLL 位于可执行文件夹中时,该应用程序运行良好。因为我想为不同的项目配置加载不同的 ffmpeg 版本,所以我需要将它们放在与 .exe 不同的文件夹中(即“/bin/ffmpeg/config1”、“/bin/ffmpeg/config2”等)。我知道如何在不修改环境 PATH 的情况下执行此操作的唯一方法是将 DLL 标记为“延迟加载”,然后在启动时通过 LoadLibrary 调用指定完整路径。

这适用于其他 DLL,但对于 FFMPEG,我无法使其正常工作。

我已经在我的 vcxproj 中指定了要延迟加载的 DLL(实际上是在链接的 .props 文件中):

在启动时,我通过 LoadLibrary 加载它们:

奇怪的是,当我进行 LoadLibrary 调用时,它似乎正在加载它们,然后立即卸载其中一些:

因此,问题似乎与它选择卸载一些 dll 的事实有关。如果我根本不包含对 LoadLibrary 的任何调用,那么我在调用这些库的第一行代码中就会崩溃,这是 avutil-56.dll 中的一个函数。如果我包含对 LoadLibrary 的调用,那么前几个函数调用成功,然后我们在第一次调用未加载的库时崩溃,特别是 avcodec-58.dll 中的“av_codec_iterate()”。如果我将卸载的 DLL 复制到可执行文件夹,那么一切运行正常。

为什么有些 DLL 被卸载?我该如何预防呢?

0 投票
0 回答
235 浏览

clang - 使用 clang LLVM 延迟加载

使用 Windows 下的 Visual Studio,可以延迟加载库和函数,使用延迟Imp.lib 提供的链接标志“/DelayLoad somelib.lib”。

在幕后,这样做似乎告诉链接器使用 Win32 API LoadLibrary 和 GetProcAddress 包装“somelib.lib”的每个引用函数,这允许在运行时解析函数。

我需要在 Windows 下使用 clang 完成相同的操作,但没有找到关于该主题的任何文档。

可以使用 clang / LLVM 延迟加载库,如果是这样,怎么做?

出于好奇,这是将meterpreter的代码库移植到clang 的正在进行的项目的一部分,该项目严重依赖于MSVC 提供的延迟加载。

0 投票
1 回答
1917 浏览

react-native - ReactNative - ImageBackground 延迟加载本地图像

我注意到,当我运行react-native应用程序时,我使用标签设置为背景的图像会<ImageBackground>延迟近 2 秒加载,即使它们不是重图像(~100K)并且它们存储在本地。

我也读过这个答案,但它并没有解决我的问题。

这是我插入图像作为背景的简单代码:

0 投票
0 回答
330 浏览

c++ - 在 Windows 中卸载延迟加载的 dll

我正在尝试将 __FUnloadDelayLoadedDLL2 与 opengl32.dll 一起使用。

我已经定义了:

在链接器选项中,然后

但这返回错误。

中的名称__FUnloadDelayLoadedDLL2必须完全匹配,所以我从DEPENDENTS table.

如果我__FUnloadDelayLoadedDLL2("OPENGL32.dll")在代码的不同点再次调用,它会返回 true,这意味着 dll 已卸载。但是然后我打电话GetModuleHandle("OPENGL32.dll")并且手柄存在。任何想法?

是否可以卸载延迟加载opengl32.dll?或者有什么冲突gdi32.dll吗?

0 投票
1 回答
64 浏览

c++ - 延迟加载具有相同名称的不同库

我有以下情况:

可执行应用程序可以通过 dll 进行定制,并且这些定制中的多个可以并行启动。对于常见任务,这些 dll 可以使用动态链接的开源库,如 OpenSSL(libssl.liblibcrypto.lib,它们正在检索模块libssl-1_1-x64.dlllibcrypto-1_1-x64.dll)。

为了检索所需的库模块,它们与/delayload选项链接。但是,如果库具有相同的名称(例如,因为它们是同一库的不同版本),则第一个LoadLibrary将为所有库进行绑定。

在更抽象的描述中,以下场景将检索lib1\lib.dlllib2\lib.dll,但它始终会从lib1\lib.dll调用功能,因为首先检索到此模块。

有没有办法影响 dll2.dll 的绑定,而不是使用GetProcAddress检索到的 dll?