获取已加载 DLL 的版本 (Windows API)

Getting Version of already loaded DLL (Windows API)

好的,在加载之前获取dll 的文件版本很容易。我正在使用 GetFileVersionInfoSize + GetFileVersionInfo + VerQueryValue,它的效果非常好。

但是如果 dll 已经加载了怎么办?我知道您可以使用 LoadLibrary + IMAGE_DOS_HEADER + IMAGE_NT_HEADERS 来检索某些信息,例如函数名称等。我注意到 IMAGE_OPTIONAL_HEADER 具有不同的版本字段,例如 MajorImageVersion 和 MinorImageVersion 等。我试过了几乎所有内容,但这些字段并不总是设置,即使设置了,它们也与 GetFileVersionInfo 返回的值不匹配。所以我猜我找错地方了。有什么想法吗?

加载 DLL 后,您可以这样做:

  1. 使用 GetModuleHandle() 获取 DLL 句柄。

  2. 将该句柄与 FindResource()/LoadResource()/LockResource() 一起使用以访问 DLL 的 RT_VERSION 资源数据。

  3. 将该资源数据复制到您分配的内存块(重要!)。使用 SizeofResource() 知道要分配和复制多少字节。

  4. 将该内存块传递给 VerQueryValue() 以访问其 VS_FIXEDFILEINFO 结构,其中包含 DLL 的版本号。

第 3 步很重要,因为 VerQueryValue() 需要访问可写内存(它依赖于在内存内容中进行的各种修复)。 LockResource() 返回的内存指针指向只读内存。如果您尝试直接使用资源指针,VerQueryValue() 将会崩溃。