我有一个需要从特定 dll 中检索版本信息的 exe(例如:FileDescription)。我的代码已经调用了 GetFileVersionInfoSize 和 GetFileVersionInfo。但我不确定如何应用 VerQueryValue,即使在通过http://msdn.microsoft.com/en-us/library/ms647464(v=vs.85)和其他示例之后也是如此。
有人可以解释/阐明如何应用 VerQueryValue 及其用法吗?谢谢。
我有一个需要从特定 dll 中检索版本信息的 exe(例如:FileDescription)。我的代码已经调用了 GetFileVersionInfoSize 和 GetFileVersionInfo。但我不确定如何应用 VerQueryValue,即使在通过http://msdn.microsoft.com/en-us/library/ms647464(v=vs.85)和其他示例之后也是如此。
有人可以解释/阐明如何应用 VerQueryValue 及其用法吗?谢谢。
要通过 VerQueryValue 获取 FileDescription,只需复制并粘贴 VerQueryValue 文档中的示例代码,并根据需要进行修改。
该示例代码背后的基本思想是:
(第一种形式 () 仅用于 VS_FIXEDFILEINFO,即版本号、标志等部分的一组数值)
示例代码获取每种语言的 FileDescription。如果您知道您只有一种语言(例如,因为您正在查看自己的应用程序,并且它没有被翻译),您可以跳过循环并返回第一个。对于更一般的用途,您希望为用户的语言选择最佳匹配并返回该语言。
这是一个工作示例,经过多次尝试和错误。我正在使用 Borland C++,因此可能需要针对不兼容的环境更改次要细节。
#include <Windows.h>
std::string GetAppVersion()
{
DWORD dwHandle;
TCHAR fileName[MAX_PATH];
GetModuleFileName(NULL, fileName, MAX_PATH);
DWORD dwSize = GetFileVersionInfoSize(fileName, &dwHandle );
TCHAR buffer[dwSize];
VS_FIXEDFILEINFO* pvFileInfo = NULL;
UINT fiLen = 0;
if ((dwSize > 0) && GetFileVersionInfo(fileName, dwHandle, dwSize, &buffer))
{
VerQueryValue(&buffer, L"\\", (LPVOID*)&pvFileInfo, &fiLen);
}
if (fiLen > 0)
{
char buf[25];
int len = sprintf(buf, "%hu.%hu.%hu.%hu",
HIWORD(pvFileInfo->dwFileVersionMS),
LOWORD(pvFileInfo->dwFileVersionMS),
HIWORD(pvFileInfo->dwFileVersionLS),
LOWORD(pvFileInfo->dwFileVersionLS)
);
return std::string(buf, len);
}
else
{
return std::string("(Unknown)");
}
}