我有一个需要从特定dll检索版本信息的exe(例如:FileDescription)。我的代码已经调用了GetFileVersionInfoSize和GetFileVersionInfo。但即使经过http://msdn.microsoft.com/en-us/library/ms647464(v=vs.85)和其他示例,我也不确定如何应用VerQueryValue。
有人可以解释/阐明如何应用VerQueryValue及其用法吗?感谢。
答案 0 :(得分:6)
要通过VerQueryValue获取FileDescription,只需复制并粘贴VerQueryValue文档中的示例代码,并根据需要进行修改。
该示例代码背后的基本思想是:
(第一个form()仅适用于VS_FIXEDFILEINFO,版本号部分,标志等的一组数值。)
示例代码获取每种语言的FileDescription。如果你知道你只有一种语言(例如,因为你正在查看自己的应用程序,并且没有翻译),你可以跳过循环并返回第一个。对于更一般的用途,您希望为用户的语言选择最佳匹配并返回该语言。
答案 1 :(得分:0)
这是一个工作示例,经过多次尝试和错误。我使用的是 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)");
}
}