在程序的标题栏中显示版本号有助于用户快速了解自己所用程序的版本。
在关于对话框中也会显示程序的版本号。
在资源文件中设置好版本信息后,可以在程序的属性中查看到程序的版本信息。
改个版本号至少要修改3个地方,太麻烦了。
可以用下面的方法直接读出程序的版本号,将版本号用程序控制显示在标题栏以及关于对话框中。
之后只需要改资源文件中的版本号这一个地方就行了,再也不会出现改了这个地方忘了那个地方的事情了。
// 获取版本号需要使用这个库
#pragma comment(lib,"Version.lib")
void CXXXXXX::GetVersion(CString &ver)
{
DWORD dwInfoSize = 0;
TCHAR exePath[MAX_PATH];
memset(exePath, 0, sizeof(exePath));
ver.Format(_T("V1.00"));
// 得到程序的自身路径
GetModuleFileName(NULL, exePath, sizeof(exePath)/sizeof(TCHAR));
// 判断是否能获取版本号
dwInfoSize = GetFileVersionInfoSize(exePath, NULL);
if (dwInfoSize == 0)
{
::OutputDebugString(L"GetFileVersionInfoSize fail\r\n");
}
else
{
BYTE* pData = new BYTE[dwInfoSize];
// 获取版本信息
if (!GetFileVersionInfo(exePath, NULL, dwInfoSize, pData))
{
::OutputDebugString(L"GetFileVersionInfo fail\r\n");
}
else
{
// 查询版本信息中的具体键值
LPVOID lpBuffer;
UINT uLength;
if (!::VerQueryValue((LPCVOID)pData, _T("\\"), &lpBuffer, &uLength))
{
::OutputDebugString(L"GetFileVersionInfo fail\r\n");
}
else
{
DWORD dwVerMS;
DWORD dwVerLS;
dwVerMS = ((VS_FIXEDFILEINFO*)lpBuffer)->dwProductVersionMS;
dwVerLS = ((VS_FIXEDFILEINFO*)lpBuffer)->dwProductVersionLS;
ver.Format(_T("V%d.%d.%d.%d"), (dwVerMS >> 16), (dwVerMS & 0xFFFF), (dwVerLS >> 16), (dwVerLS & 0xFFFF));
}
}
delete pData;
}
}
在需要获取版本号的地方,通过这个方法即可直接或间接获取到程序版本号了,形式为: V1.2.3.4
比如,在标题中插入版本号:
// 在标题中加入程序的版本信息
CString exeVer;
CString exeCaption;
this->GetWindowText(exeCaption);
this->GetVersion(exeVer);
exeCaption.AppendFormat(L" %s", exeVer);
this->SetWindowText(exeCaption);
对于子窗口,如关于对话框,通过主窗口获取版本号后传值进去即可:
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
this->GetVersion(dlgAbout.mVersion);
dlgAbout.DoModal();
}