我有一个DLL,包含代码(导出的函数)和数据(嵌入作为资源的二进制数据)。
此DLL静态链接到我的程序(EXE)。为了访问DLL中的二进制数据,我需要一个DLL的句柄(HMODULE),所以我可以将这个句柄传递给Win32 API,如FindResource()等。
我的查询是哪个函数 - LoadLibrary()或GetModuleHandleEx() - 我应该在这个静态链接的DLL上使用,以便保证返回的句柄是非NULL(即有效)。
我在GetModuleHandleEx()上提到了MSDN文档。它说这个API用于获取已经加载的模块的句柄,但它没有说明当它用于静态链接(也可以假设已经加载)DLL时的行为。
LoadLibrary()对我来说很好,但我担心的是,如果将静态链接的DLL再次加载到程序的地址空间中会产生额外的开销吗?或者将使用LoadLibrary()仅增加DLL的引用计数?
静态链接的.DLL被固定,它们无法卸载。 LoadLibrary
和GetModuleHandle
在固定的.DLL上具有相同的行为(假设您传递了正确的名称)。
LoadLibrary
将增加引用计数(在非固定的.DLL上),但它不会改变地址空间。在尚未加载的路径上调用LoadLibrary
当然会加载一个新模块,因为GetModuleHandle
将失败。如果传入没有路径的文件名,它们将作用于已加载的.DLL(如果存在)。