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