好的,在加载之前获取dll的文件版本很容易。即时通讯使用GetFileVersionInfoSize + GetFileVersionInfo + VerQueryValue,它就像一个魅力。
但是如果dll已经加载怎么办?我知道您可以使用LoadLibrary + IMAGE_DOS_HEADER + IMAGE_NT_HEADERS来检索某些信息,例如函数名称等。我注意到IMAGE_OPTIONAL_HEADER有不同的版本字段,例如MajorImageVersion& MinorImageVersion等我几乎尝试了所有东西,但这些字段并不总是设置,当它们是,它们不匹配GetFileVersionInfo返回的值。所以我猜我正在寻找错误的地方。任何想法?
答案 0 :(得分:4)
加载DLL后,您可以执行以下操作:
使用GetModuleHandle()
获取DLL的句柄。
使用FindResource()
/ LoadResource()
/ LockResource()
的句柄来访问DLL的RT_VERSION
资源数据。
将该资源数据的副本复制到您分配的内存块(重要!)。使用SizeofResource()
知道要分配和复制的字节数。
将该内存块传递给VerQueryValue()
以访问其VS_FIXEDFILEINFO
结构,其中包含DLL的版本号。
第3步非常重要,因为VerQueryValue()
需要访问可写内存(它依赖于在内存内容中进行的各种修正)。 LockResource()
返回的内存指针指向只读内存。如果您尝试直接使用资源指针,VerQueryValue()
将崩溃。