读书人

c++ builder6.0解决办法

发布时间: 2013-08-01 15:23:18 作者: rapoo

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;
}

读书人网 >C++ Builder

热点推荐