哪种方法更好地获取静态链接 DLL 的模块句柄 (HMODULE) - 使用 GetModuleHandleEx() 或 LoadLibrary()?

阿努拉格·夏尔马

我有一个包含代码(导出函数)和数据(作为资源嵌入的二进制数据)的 DLL。

这个 DLL 静态链接到我的程序 (EXE) 中。为了访问 DLL 中的二进制数据,我需要此 DLL 的句柄 (HMODULE),以便我可以将此句柄传递给诸如 FindResource() 等的 Win32 API。

我的查询是哪个函数 - LoadLibrary() 或 GetModuleHandleEx() - 我应该在这个静态链接的 DLL 上使用,以便保证返回的句柄是非 NULL(即有效)

我参考了 GetModuleHandleEx() 上的 MSDN 文档。它说这个 API 将用于获取已加载模块的句柄,但它没有说明当它用于静态链接(也可以假设已经加载)DLL 时的行为是什么。

LoadLibrary() 对我来说很好,但我担心它是否会在将静态链接的 DLL 再次加载到我的程序地址空间时产生额外的开销?还是使用 LoadLibrary() 只会增加 DLL 的引用计数?

不同的

静态链接的 .DLL 是固定的,无法卸载。LoadLibraryGetModuleHandle在固定的 .DLL 上具有相同的行为(假设您传入正确的名称)。

LoadLibrary将增加引用计数(在非固定的).DLL 上,但它不会改变地址空间。调用LoadLibrary尚未加载的路径当然会加载一个新模块,而 asGetModuleHandle会失败。如果您传入没有路径的文件名,它们将作用于已加载的 .DLL(如果存在)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

关闭由LoadLibrary打开的DLL文件句柄

使用绝对路径通过 LoadLibrary() 和 GetModuleHandle() 加载系统 DLL 是否更好地防止 DLL 劫持?

Delphi:使用LoadLibrary加载DLL的奇怪行为

GetModuleHandleEx在csrsrv.dll上失败

如何获取通过LoadLibrary()加载的DLL的内存使用情况?

使用LoadLibrary打开dll进行分析是否安全?

使用本机方法时,android loadLibrary失败

在构建将使用LoadLibrary加载的DLL时,我是否需要与相关二进制文件链接或是否包含头文件?

为什么Qt Creator在没有.lib和LoadLibrary()的情况下可以正确链接dll?

VS2013-LoadLibrary找不到dll

MIP SDK错误:LoadLibrary因以下原因而失败:[sdk_wrapper_dotnet.dll]使用c#

如何为 .NET 程序集(类库)获取本机 HMODULE?

LoadLibrary失败-找不到指定的模块

我如何在不传递句柄参数的情况下使用Delphi在dll项目中获取主机应用程序句柄

为什么 LoadLibrary 失败而 LoadLibraryA 成功加载 DLL?

Easyhook:如何从加载了 LoadLibrary 的 DLL 中挂钩函数

C ++-LoadLibrary为自制DLL返回126错误

LoadLibrary 在运行时加载 dll 时返回 126

从Fragment调用或使用Singleton类调用MainActivity的方法,哪种方法更好地防止内存泄漏?

使用模块定义文件 (.def) 导入 DLL

Windows特权,不确定时获取.dll的句柄,不确定

为什么LoadLibrary无法使用给定路径?

无法使用watin dll从分页获取链接

为 FileOutputStream 方法调用 System.loadLibrary()

如何使用Windows DLL方法

(静态链接的)DLL是否使用与主程序不同的堆?

使用cython --embed时静态链接python37.dll和vcruntime140.dll

什么变成了用Java加载System.loadLibrary()的.dll的搜索路径?

可以捕获UnsatisfiedLinkError以便在调用System.LoadLibrary时回退到其他DLL吗?