1.先在工程中添加Version资源
2.要在vs工程属性添加Version.lib到linker input选项中。
3.GetModuleFileName获取当前执行的模块的fullPath.
4.GetFileVersionInfoSize获取版本信息文件的大小
5.GetFileVersionInfo获取版本信息,并把它放在buffer中。
6.VerQueryValue从buffer中获取version的信息。
我想大家在做软件升级的时候,经常想到要获取当前软件的版本与网络的中的一个软件版本进行判断,是否需要对软件进行 更新升级.我最近也在做,本来想到网上下一段获取版本的代码,想不到找了许久,都找不到一个能拷来就在mfc环境下面用的.也许是本人找东西的功力还非常 有限,我愿意把自己拼凑好的代码贴出来,让和我一样,不愿去写一些琐碎的代码和没有较强的搜索欲望的朋友.
以下是我个人获得当前运行程序的版本的函数,可以直接在mfc环境下使用,由于使用到CString这个类,要移到别的环境,还要做一点改动.
CString CLogInDlg::GetFileVer()
{
char cPath[200],szVersionBuffer[200];
DWORD dwHandle,InfoSize;
CString strVersion;
::GetModuleFileName(NULL,cPath,sizeof(cPath));
//首先获得版本信息资源的长度
InfoSize = GetFileVersionInfoSize(cPath,&dwHandle);
//将版本信息资源读入缓冲区
if(InfoSize==0) return _T("None VerSion Supprot");
char *InfoBuf = new char[InfoSize];
GetFileVersionInfo(cPath,0,InfoSize,InfoBuf);
//获得生成文件使用的代码页及文件版本
unsigned int cbTranslate = 0;
struct LANGANDCODEPAGE {
WORD wLanguage;
WORD wCodePage;
} *lpTranslate;
VerQueryValue(InfoBuf, TEXT("/VarFileInfo/Translation"),(LPVOID*)&lpTranslate,&cbTranslate );
// Read the file description for each language and code page.
for( int i=0; i < (cbTranslate/sizeof(struct LANGANDCODEPAGE)); i++ )
{
char SubBlock[200];
wsprintf( SubBlock,
TEXT("/StringFileInfo/%04x%04x/FileVersion "),
lpTranslate[i].wLanguage,
lpTranslate[i].wCodePage);
void *lpBuffer=NULL;
unsigned int dwBytes=0;
VerQueryValue(InfoBuf,
SubBlock,
&lpBuffer,
&dwBytes);
CString strTemp=(char *)lpBuffer;
strVersion+=strTemp;
}
return strVersion;
}
希望对大家有些帮助