MFC编程实例:VC MFC程序,在About对话框中获取并显示程序的版本号
安安 2017-09-20 来源 :网络 阅读 1108 评论 0

摘要:本文将为大家讲解关于MFC编程实例中MFC消息处理流程,通过MFC编程实例的内容让你对相关知识点有进一步的认识和理解!

    本文将为大家讲解关于MFC编程实例中MFC消息处理流程,通过MFC编程实例的内容让你对相关知识点有进一步的认识和理解!


    用VC++写的MFC程序,不管是exe的或者dll,都有个'VERSION'资源,在里面可以指定程序的版本号,这样在程序文件上右键点击,查看属性,就可以看到内嵌的版本信息了。同样,所有程序都愿意在'About'对话框中显示程序的当前版本,但是这里如何显示,跟资源里的'VERSION'信息还是有好几毛钱的关系呢 :)

    如果我们从'VERSION'资源里获取版本信息并在about对话框中显示,那么我们每次发布的时候只要修改'VERSION'里的信息就行了,经过一定处理,就可以在about对话框中显示了。

    其实MSDN中也有说明,但是说实话,要想从'VERSION'中读取信息,还真不是件简单的事情,下面一一实现,代码大部分来自MSDN。

    结果如下图所示:

 MFC编程实例:VC MFC程序,在About对话框中获取并显示程序的版本号

显示1.1.6 build 718

 

    代码:

 

 

void CAboutDlg::OnShowWindow(BOOL bShow, UINT nStatus)
{
 CDialog::OnShowWindow(bShow, nStatus);

 // TODO: 在此处添加消息处理程序代码


 CString ver = GetAppVersion(L"TowerWatch.exe");
 if(ver.IsEmpty()) return;

 int pos = ver.ReverseFind('.');
 CString mainVer = ver.Left(pos);
 CString build = ver.Right(ver.GetLength() - pos -1);
 GetDlgItem(IDC_STATIC_VER)->SetWindowText(mainVer);
 GetDlgItem(IDC_STATIC_BUILD)->SetWindowText(build);

}

void ErrorExit(LPTSTR lpszFunction) 

 // Retrieve the system error message for the last-error code

 LPVOID lpMsgBuf;
 LPVOID lpDisplayBuf;
 DWORD dw = GetLastError(); 

 FormatMessage(
  FORMAT_MESSAGE_ALLOCATE_BUFFER | 
  FORMAT_MESSAGE_FROM_SYSTEM |
  FORMAT_MESSAGE_IGNORE_INSERTS,
  NULL,
  dw,
  MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
  (LPTSTR) &lpMsgBuf,
  0, NULL );

 // Display the error message and exit the process

 lpDisplayBuf = (LPVOID)LocalAlloc(LMEM_ZEROINIT, 
  (lstrlen((LPCTSTR)lpMsgBuf)+lstrlen((LPCTSTR)lpszFunction)+40)*sizeof(TCHAR)); 
 StringCchPrintf((LPTSTR)lpDisplayBuf, 
  LocalSize(lpDisplayBuf),
  TEXT("%s failed with error %d: %s"), 
  lpszFunction, dw, lpMsgBuf); 
 MessageBox(NULL, (LPCTSTR)lpDisplayBuf, TEXT("Error"), MB_OK); 

 LocalFree(lpMsgBuf);
 LocalFree(lpDisplayBuf);
}

 

CString CAboutDlg::GetAppVersion(WCHAR* AppName) 
{
 CString   AppVersion; 

 DWORD   RessourceVersionInfoSize; 
 DWORD   JustAJunkVariabel; 
 WCHAR*   VersionInfoPtr; 
 struct   LANGANDCODEPAGE
 { 
  WORD   wLanguage; 
  WORD   wCodePage; 
 }   *TranslationPtr; 
 WCHAR*     InformationPtr; 
 UINT      VersionInfoSize; 
 WCHAR     VersionValue[255]; 

 RessourceVersionInfoSize=GetFileVersionInfoSize(AppName,&JustAJunkVariabel); 
 if(0!=RessourceVersionInfoSize) 
 {
  VersionInfoPtr = new WCHAR[RessourceVersionInfoSize];
  if(!GetFileVersionInfo(AppName,0,RessourceVersionInfoSize,VersionInfoPtr)) 
  {
    ErrorExit((LPTSTR)L"GetFileVersionInfo");
   delete[]   VersionInfoPtr; 
   return NULL; 
  } 

  if(!VerQueryValue( VersionInfoPtr, L"VarFileInfo\\Translation", (LPVOID*)&TranslationPtr, &VersionInfoSize)) 
  { 
   ErrorExit((LPTSTR)L"VerQueryValue");
   delete[]   VersionInfoPtr; 
   return NULL; 
  } 

  // retrieve product version
  wsprintf(VersionValue, L"\\StringFileInfo\\%04x%04x\\ProductVersion", TranslationPtr[0].wLanguage, TranslationPtr[0].wCodePage); 

  if(!VerQueryValue( VersionInfoPtr, VersionValue, (LPVOID*)&InformationPtr, &VersionInfoSize)) 
  { 
   ErrorExit((LPTSTR)L"VerQueryValue");
   delete[]   VersionInfoPtr; 
   return NULL; 
  } 
  if(wcslen(InformationPtr)> 0)   //Not   Null 
  { 
   AppVersion=CString(InformationPtr); 
  } 

  delete[]   VersionInfoPtr; 
 } 
 return   AppVersion; 

 

 

当然,你可以将分解Version和build部分代码也封装到GetAppVersion函数中。

 

希望这篇MFC编程文章可以帮助到你。总之,同学们,你想要的职坐标MFC频道都能找到!


本文由 @安安 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程