CString modFilename;
if(GetModuleFileName(AfxGetInstanceHandle(), modFilename.GetBuffer(MAX_PATH), MAX_PATH) > 0)
{
modFilename.ReleaseBuffer(MAX_PATH);
DWORD dwHandle = 0;
DWORD dwSize = GetFileVersionInfoSize(modFilename, &dwHandle);
if(dwSize > 0)
{
LPBYTE lpInfo = new BYTE[dwSize];
ZeroMemory(lpInfo, dwSize);
if(GetFileVersionInfo(modFilename, 0, dwSize, lpInfo))
{
//// Use the version information block to obtain the FILEVERSION.
//// This will extract language specific part of versio resources. 040904E4 is English(US) locale,
//// it should match to your project
//UINT valLen = MAX_PATH;
//LPVOID valPtr = NULL;
//if(::VerQueryValue(lpInfo,
//TEXT("//StringFileInfo//040904E4//FileVersion"),
//&valPtr,
//&valLen))
//{
//CString valStr((LPCTSTR)valPtr);
//AfxMessageBox(valStr);
//}
//// This will extract so called FIXED portion of the version info
UINT valLen = MAX_PATH;
LPVOID valPtr = NULL;
if(::VerQueryValue(lpInfo,
TEXT("//"),
&valPtr,
&valLen))
{
VS_FIXEDFILEINFO* pFinfo = (VS_FIXEDFILEINFO*)valPtr;
// convert to text
CString valStr;
valStr.Format(_T("%d.%d.%d.%d"),
(pFinfo->dwFileVersionMS >> 16) & 0xFF,
(pFinfo->dwFileVersionMS) & 0xFF,
(pFinfo->dwFileVersionLS >> 16) & 0xFF,
(pFinfo->dwFileVersionLS) & 0xFF
);
AfxMessageBox(valStr);
}
}
delete[] lpInfo;
}
}
Code is here:
本文介绍了一种使用C++从当前运行的程序中提取版本信息的方法。通过调用Windows API函数GetModuleFileName、GetFileVersionInfo及VerQueryValue,可以读取并解析程序文件的版本资源,最终展示版本号。
1775

被折叠的 条评论
为什么被折叠?



