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

问题描述 投票:0回答:1

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

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

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

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

LoadLibrary()对我来说很好,但我担心的是,如果将静态链接的DLL再次加载到程序的地址空间中会产生额外的开销吗?或者将使用LoadLibrary()仅增加DLL的引用计数?

c++ winapi dll
1个回答
2
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.