问题标签 [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.
python - Windows 中的延迟加载
我试图了解一些代码(直接从 PyCXX 改编)。它是一个多平台 C++ Python 包装器。
编辑:这里的原始代码。
它似乎迎合了一些只存在于 Windows 中的特殊现象:
我将在下面给出完整的文件列表,它很长。
这个 PY_WIN32_DELAYLOAD_PYTHON_DLL 令牌在 CPython 中不存在,它也没有在 PyCXX 中定义。因此我只能想象 PyCXX 打算将它作为可选的编译器标志提供。
我想知道的是:它的目的是什么?它在解决什么问题?为什么这种机制甚至存在?
也许熟悉Windows编程的人可以从代码中弄清楚?
我想知道它正在解决的问题是否仍然存在于现代 Windows 中,因为代码已经超过 15 年了。
关键问题是:我可以删除它,还是用更清洁的东西代替它?
我非常想把它剪掉;但它在现代 Windows 环境中仍然有一些有用的用途吗?
代码:
windows - 延迟加载的 DLL 对避免链接特定函数有用吗?
考虑以下代码,它需要调用User32.dll
.
如果我没记错的话,这个程序在WinXP下会启动失败,因为在XP下AddClipboardFormatListener
不存在User32.dll
。
解决此问题的一种方法不是AddClipboardFormatListener
直接调用,而是自己获取指向它的指针:
GetProcAddress(GetModuleHandle("User32.dll"), "AddClipboardFormatListener")
.
但是,如果我指示链接器延迟加载User32.dll
...
- 这是否会避免在 XP 下加载该特定功能,以便我不需要调用
GetModuleHandle
andGetProcAddress
? - 当只需要延迟加载几个函数时,是否建议延迟加载 DLL?
的情况User32.dll
在第二点上特别引人注目,因为程序中使用的大多数函数都知道存在于所有 Windows 版本的该 DLL 中。
我猜想在加载时链接比在运行时更有效,因为后者需要在每次函数调用之前进行额外检查。
但我只是猜测,因此问题。
c++ - 延迟加载crypto++ cryptopp.dll
cryptlib.lib
Crypto++ 库通过针对和编译来支持后期绑定cryptopp.lib
。这需要使用cryptopp.dll
. 当尝试延迟加载此 dll 时,/DELAYLOAD:cryptopp.dll
会导致链接错误,由于需要导入,因此无法延迟加载。
作为示例,请参见以下代码:
这会导致以下链接错误:
是否有人已经成功延迟加载cryptopp.dll
?
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
。
那么我在计算中做错了什么?
c++ - 在 C++ 代码中延迟加载 C 库
我目前正在尝试将 ffmpeg 库(在 C 中)加载到我的 C++ 项目中。该库由头文件、.lib 文件和 .dll 文件组成,我成功加载并使用了所有这些文件。但是,我们的项目非常希望延迟加载这些 dll 文件,这就是我失败的地方。
它归结为:
- 当我在不参考任何库的 dll 函数的情况下构建项目时,它运行正常,并且我看到(通过我的日志)所有 dll 都在我明确获取它们的 DLL 句柄的地方正确加载。
- 当我构建项目并包含对 dll 的函数调用时,可执行文件 simple 无法加载,因为它缺少“xx.dll”。这是在函数调用完成之前。IE:只需在我的代码中调用 dll 函数,程序似乎会在启动时尝试加载它。
- 当我在我的程序可执行文件旁边手动添加 dll 时,它在两种情况下都运行良好,但不希望将它们放在我的可执行文件旁边。
有什么明显的我遗漏或做错了吗?
谢谢!
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 被卸载?我该如何预防呢?
clang - 使用 clang LLVM 延迟加载
使用 Windows 下的 Visual Studio,可以延迟加载库和函数,使用延迟Imp.lib 提供的链接标志“/DelayLoad somelib.lib”。
在幕后,这样做似乎告诉链接器使用 Win32 API LoadLibrary 和 GetProcAddress 包装“somelib.lib”的每个引用函数,这允许在运行时解析函数。
我需要在 Windows 下使用 clang 完成相同的操作,但没有找到关于该主题的任何文档。
可以使用 clang / LLVM 延迟加载库,如果是这样,怎么做?
出于好奇,这是将meterpreter的代码库移植到clang 的正在进行的项目的一部分,该项目严重依赖于MSVC 提供的延迟加载。
react-native - ReactNative - ImageBackground 延迟加载本地图像
我注意到,当我运行react-native
应用程序时,我使用标签设置为背景的图像会<ImageBackground>
延迟近 2 秒加载,即使它们不是重图像(~100K)并且它们存储在本地。
我也读过这个答案,但它并没有解决我的问题。
这是我插入图像作为背景的简单代码:
c++ - 在 Windows 中卸载延迟加载的 dll
我正在尝试将 __FUnloadDelayLoadedDLL2 与 opengl32.dll 一起使用。
我已经定义了:
在链接器选项中,然后
但这返回错误。
中的名称__FUnloadDelayLoadedDLL2
必须完全匹配,所以我从DEPENDENTS table
.
如果我__FUnloadDelayLoadedDLL2("OPENGL32.dll")
在代码的不同点再次调用,它会返回 true,这意味着 dll 已卸载。但是然后我打电话GetModuleHandle("OPENGL32.dll")
并且手柄存在。任何想法?
是否可以卸载延迟加载opengl32.dll
?或者有什么冲突gdi32.dll
吗?
c++ - 延迟加载具有相同名称的不同库
我有以下情况:
可执行应用程序可以通过 dll 进行定制,并且这些定制中的多个可以并行启动。对于常见任务,这些 dll 可以使用动态链接的开源库,如 OpenSSL(libssl.lib、libcrypto.lib,它们正在检索模块libssl-1_1-x64.dll和libcrypto-1_1-x64.dll)。
为了检索所需的库模块,它们与/delayload选项链接。但是,如果库具有相同的名称(例如,因为它们是同一库的不同版本),则第一个LoadLibrary
将为所有库进行绑定。
在更抽象的描述中,以下场景将检索lib1\lib.dll和lib2\lib.dll,但它始终会从lib1\lib.dll调用功能,因为首先检索到此模块。
有没有办法影响 dll2.dll 的绑定,而不是使用GetProcAddress
检索到的 dll?