Windows API提供了一组获取文件(这里只讨论可执行文件和DLL)版本号的函数:
GetFileVersionInfoSize
GetFileVersionInfo
VerQueryValue
使用时有几点要注意的:
1.GetFileVersionInfoSize要在GetFileVersionInfo之前调用,以获取版本信息长度,然后分配合适的内存。
2.VerQueryValue中的分割符定义在获取版本号时使用"//"
BOOL CModuleVersionViewDlg::GetPEVersion(CString FileName, WORD& MajorVersion, WORD& MinorVersion, WORD& BuildNumber, WORD& Revision)
{
VS_FIXEDFILEINFO *lpBuf = NULL;
DWORD dwLen = 0;
DWORD dwHandle = 0;
LPTSTR lpData = NULL;
BOOL bRc = TRUE;
UINT uiLen = 0;
DWORD dwError = 0;
dwLen = GetFileVersionInfoSize(FileName, &dwHandle);
if ((0 == dwLen) && (0 != (dwError = GetLastError())))
{
TRACE(_T("GetFileVersionInfoSize fail!"));
return FALSE;
}
lpData = new TCHAR [dwLen];
ASSERT(lpData);
bRc = GetFileVersionInfo(FileName, dwHandle, dwLen, lpData);
if ((FALSE == bRc) && (0 != GetLastError()))
{
TRACE(_T("GetFileVersionInfo fail!"));
return FALSE;
}
bRc = VerQueryValue(lpData, _T("//"), (LPVOID *)&lpBuf, &uiLen);
if ((FALSE == bRc) && (0 != GetLastError()))
{
TRACE(_T("VerQueryValue fail!"));
return FALSE;
}
MajorVersion = HIWORD(lpBuf->dwFileVersionMS);
MinorVersion = LOWORD(lpBuf->dwFileVersionMS);
BuildNumber = HIWORD(lpBuf->dwFileVersionLS);
Revision = LOWORD(lpBuf->dwFileVersionLS);
return FALSE;
}