获取dll,exe等文件的版本信息:
BOOL GetPeVersion(QString& strVersion, const TCHAR *pFileName)
{
TCHAR tchPeFile[MAX_PATH + 1] = { 0 };
if (pFileName && '\0' != *pFileName)
{
::lstrcpyn(tchPeFile, pFileName, MAX_PATH);
}
else
{
::GetModuleFileName(NULL, tchPeFile, MAX_PATH);
}
unsigned long dwBufLen = 0l;
unsigned char* pbyBuffer = NULL;
VS_FIXEDFILEINFO* lpFileInfo = NULL;
UINT nFileInfoLen = 0;
BOOL bRet = FALSE;
dwBufLen = ::GetFileVersionInfoSize(tchPeFile, NULL);
if (0l == dwBufLen)
{
return FALSE;
}
pbyBuffer = new unsigned char[dwBufLen + 1];
if (!pbyBuffer)
{
return FALSE;
}
::memset(pbyBuffer, 0, dwBufLen + 1);
if (!::GetFileVersionInfo(tchPeFile, NULL, dwBufLen, pbyBuffer))
{
goto exit;
}
if (!::VerQueryValue(pbyBuffer, TEXT("\\"), (void**)&lpFileInfo, &nFileInfoLen))
{
goto exit;
}
int m1 = lpFileInfo->dwFileVersionMS >> 16;
int m2 = (WORD)lpFileInfo->dwFileVersionMS;
int m3 = lpFileInfo->dwFileVersionLS >> 16;
int m4 = (WORD)lpFileInfo->dwFileVersionLS;
strVersion += QString::number(m1);
strVersion += ".";
strVersion += QString::number(m2);
strVersion += ".";
strVersion += QString::number(m3);
strVersion += ".";
strVersion += QString::number(m4);
bRet = TRUE;
exit:
if (pbyBuffer)
{
delete[]pbyBuffer;
pbyBuffer = NULL;
}
return bRet;
}
使用:
char info[512] = { 0 };
GetSystemDirectoryA(info, MAX_PATH); //获取系统路径,得到“C:\\ProgramFile(x86)\\system32”
QString infoQStr(info);
infoQStr += "\\riched20.dll";
QString versionTempStr;
BOOL retValue = GetPeVersion(versionTempStr, infoQStr.toStdWString().c_str());
if (versionTempStr == "5.31.23.1230") {
m_copyRichFile = true;
}