1.引入Version.lib
#pragma comment(lib, "Version.lib ")
因为我们需要用到VerQueryValue,这一步不可缺少。
2.添加代码
CString CCamereCharCheckDlg::GetAppVersion()
{
CString m_csProductVersion;
/* 获得程序路径 */
char cPath[200];
::GetModuleFileName(NULL, cPath, sizeof(cPath)); //获取应用程序路径
/* 获得版本信息大小 */
DWORD dwHandle, InfoSize;
InfoSize = GetFileVersionInfoSize(cPath, &dwHandle); //获取版本信息总体的大小
if (InfoSize == 0)
{
AfxMessageBox(_T("None VerSion Supprot"));
return m_csProductVersion;
}
char *InfoBuf = new char[InfoSize];
GetFileVersionInfo(cPath, 0, InfoSize, InfoBuf); //获得生成文件使用的代码页及文件版本
unsigned int cbTranslate = 0;
/* 该结构用于获得版本信息的语言信息 */
struct LANGANDCODEPAGE
{
WORD wLanguage;
WORD wCodePage;
} *lpTranslate;
VerQueryValue(InfoBuf, TEXT("\\VarFileInfo\\Translation"), (LPVOID*)&lpTranslate, &cbTranslate);
for (int i = 0; i < (cbTranslate / sizeof(struct LANGANDCODEPAGE)); i++)
{
char SubBlock[200];
wsprintf(SubBlock,
TEXT("\\StringFileInfo\\%04x%04x\\FileVersion"),
lpTranslate[i].wLanguage,
lpTranslate[i].wCodePage);
void *lpBuffer = NULL;
unsigned int dwBytes = 0;
VerQueryValue(InfoBuf,
SubBlock,
&lpBuffer,
&dwBytes);
CString strTemp = (char *)lpBuffer;
m_csProductVersion += strTemp;
}
delete InfoBuf;
return m_csProductVersion;
}
调用VerQueryValue这个函数可以获得MFC中Version中标志为Blocker Header的项,然后在根据构造参数和相应的偏移值,再次调用VerQueryValue就可以获得指定的信息。