获取程序版本号
// include <windows.h>
// include <winver.h>
// method 1.
// get version from file name.
bool func_a(const char *pfile_name)
{
bool bret = false;
unsigned long isize = GetFileVersionInfoSize(pfile_name,NULL);
if(isize == 0)
return false;
VS_FIXEDFILEINFO *pvs_ffi = NULL;
unsigned int ilen = 0;
unsigned char *pbuf = new unsigned char [isize];
if(pbuf == NULL)
return false;
memset(pbuf,0,isize);
if(!GetFileVersionInfo(pfile_name,NULL,isize,pbuf) )
{
delete [] pbuf;
return false;
}
if(VerQueryValue(pbuf,"\\",(void **)&pvs_ffi,&ilen))
{
cout<<"version: "
<<HIWORD(pvs_ffi->dwFileVersionMS)<<"."
<<LOWORD(pvs_ffi->dwFileVersionMS)<<"."
<<HIWORD(pvs_ffi->dwFileVersionLS)<<"."
<<LOWORD(pvs_ffi->dwFileVersionLS)<<endl;
bret = true;
}
delete [] pbuf;
return bret;
}
//struct VS_VERSIONINFO
//{
// WORD wLength;
// WORD wValueLength;
// WORD wType;
// WCHAR szKey[16];//contains a unicode string L"VS_VERSION_INFO".
// WORD Padding1[0];
// VS_FIXEDFILEINFO Value;
// WORD Padding2[0];
// WORD Children[0];
//};
// method 2.
// get version from resource.
bool func_b(void)
{
VS_FIXEDFILEINFO *pvs_ffi = NULL;
HMODULE hmdl = GetModuleHandle(NULL);
HRSRC hrsrc = FindResource(hmdl,MAKEINTRESOURCE(VS_VERSION_INFO),RT_VERSION);
if(hrsrc == NULL)
return false;
HGLOBAL hgbl = LoadResource(hmdl,hrsrc);
if(hgbl == NULL)
return false;
unsigned char *pbuf = (unsigned char *)LockResource(hgbl);
if(pbuf == NULL)
return false;
pvs_ffi = (VS_FIXEDFILEINFO *)( pbuf + (sizeof(WORD) *3) + sizeof(L"VS_VERSION_INFO") + (sizeof(WORD) *1) );
cout<<"version: "
<<HIWORD(pvs_ffi->dwFileVersionMS)<<"."
<<LOWORD(pvs_ffi->dwFileVersionMS)<<"."
<<HIWORD(pvs_ffi->dwFileVersionLS)<<"."
<<LOWORD(pvs_ffi->dwFileVersionLS)<<endl;
return true;
}