c++ builder6.0
bcb 6.0 ,怎么获取软件自身的版本信息?请教大侠!
[解决办法]
楼上的代码有安全隐患,首先开辟的缓冲大小,至少应该是所需要大小+1,然后应该给字符串结尾补0x0,以防AV。
[解决办法]
void GetAPPVersion_void(char chVersion[])
{
TCHAR szModule[_MAX_PATH];
GetModuleFileName(NULL, szModule, _MAX_PATH);//得到本程序自身的全路径
int iVerInfoSize = 0;
char *pBuf = NULL;
VS_FIXEDFILEINFO *pVsInfo;
unsigned int iFileInfoSize = sizeof(VS_FIXEDFILEINFO);
iVerInfoSize = GetFileVersionInfoSize(szModule,0);
if(iVerInfoSize!= 0)
{
pBuf = new char[iVerInfoSize];
if(GetFileVersionInfo(szModule,0,iVerInfoSize,pBuf))
{
if(VerQueryValue(pBuf,"\\",(void **)&pVsInfo,&iFileInfoSize))
{
sprintf(chVersion,"%d.%d.%d.%d",
HIWORD(pVsInfo->dwFileVersionMS),
LOWORD(pVsInfo->dwFileVersionMS),
HIWORD(pVsInfo->dwFileVersionLS),
LOWORD(pVsInfo->dwFileVersionLS));
}
}
}
delete []pBuf;
pBuf = NULL;
}
[解决办法]
老妖说得是,改两笔
String __fastcall TForm1::GetVersion()
{
String res = "0.0.0.0";
DWord VerInfoSize,Dummy;
UINT VerValueSize;
PVSFixedFileInfo VerValue;
String sExe = Application->ExeName;
VerInfoSize = GetFileVersionInfoSize(sExe.c_str(),&Dummy);
if (0 != VerInfoSize) VerInfoSize++;
else return res;
char* VerInfo = new char[VerInfoSize];
memset(VerInfo, 0, VerInfoSize);
GetFileVersionInfo(ParamStr(0).c_str(), 0,VerInfoSize, VerInfo);
VerQueryValue(VerInfo,"\\", (void**)&VerValue, &VerValueSize);
VerValue->dwProductVersionMS = VerValue->dwFileVersionMS;
VerValue->dwProductVersionLS = VerValue->dwFileVersionLS;
TVarRec args[4];
args[0].VInteger = VerValue->dwProductVersionMS >> 0x10;
args[1].VInteger = VerValue->dwProductVersionMS & 0xffff;
args[2].VInteger = VerValue->dwProductVersionLS >> 0x10;
args[3].VInteger = VerValue->dwProductVersionLS & 0xffff;
res = res.Format("%d.%d.%d.%d",args,4);
delete[] VerInfo;
return res;
}