【Q tea 原创】
核心函数:VerQueryValue
VerQueryValue这个函数用于从版本资源中获取信息。调用这个函数前,必须先用GetFileVersionInfo函数获取版本资源信息。这个函数会检查资源信息,并将需要的数据复制到一个缓冲区里。
【Q tea 原创】
参数 类型及说明
pBlock Byte,指定一个内存块第一个字节的地址。这个内存块包含了由GetFileVersionInfo函数取回的版本数据信息
lpSubBlock String,下述值之一:
"\" 获取文件的VS_FIXEDFILEINFO结构
"\VarFileInfo\Translation" 获取文件的翻译表
"\StringFileInfo\...." 获取文件的字串信息。参考注解
lplpBuffer Long,指定一个Long变量的地址,该变量用于装载一个缓冲区的地址。请求的版本信息最终会装载到那个缓冲区里
puLen Long,指定由lplpBuffer参数引用的数据值的长度,以字节为单位
返回值:Long,TRUE(非零)表示成功,如请求的信息不存在,或pBlock不属于有效版本信息,那就返回一个零
// por文件中引入Version.lib
// 必须要用,不然无法获取到exe的版本信息,调用相应函数会报错
unix|win32: LIBS += -lVersion
【Q tea 原创】
相关函数 传出exe文件的绝对路径 返回值为查找到的对应信息
QString Widget::GetFileVertion(QString fullName){
DWORD dwLen = 0;
char* lpData=NULL;
LPCWSTR str_path;
str_path=fullName.toStdWString().c_str();
BOOL bSuccess = FALSE;
QString fileInfomation;
DWORD vHandle=0;
//获得文件基础信息 【Q tea 原创】
//--------------------------------------------------------
dwLen = GetFileVersionInfoSize( str_path, &vHandle);
if (0 == dwLen)
{
qDebug()<<"获取版本字节信息失败!";
return"";
}
qDebug()<<"版本信息字节大小:"<<dwLen;
lpData =(char*)malloc(dwLen+1);
if (NULL == lpData)
{
qDebug()<<"分配内存失败";
return "";
}
bSuccess = GetFileVersionInfo( fullName.toStdWString().c_str(),0, dwLen+1, lpData);
if (!bSuccess)
{
qDebug()<<"获取文件版本信息错误!";
return"";
}
LPVOID lpBuffer = NULL;
UINT uLen = 0;
//获得语言和代码页(language and code page),规定,套用即可
//---------------------------------------------------
bSuccess = VerQueryValue( lpData,
(TEXT("\\VarFileInfo\\Translation")),
&lpBuffer,
&uLen);
QString strTranslation,str1,str2;
unsigned short int *p =(unsigned short int *)lpBuffer;
str1.setNum(*p,16);
str1="000"+ str1;
strTranslation+= str1.mid(str1.size()-4,4);
str2.setNum(*(++p),16);
str2="000"+ str2;
strTranslation+= str2.mid(str2.size()-4,4);
QString str_value;
QString code;
//以上步骤需按序进行,以下步骤可根据需要增删或者调整
【Q tea 原创】
//获得文件说明:FileDescription
//---------------------------------------------------------
code ="\\StringFileInfo\\"+ strTranslation +"\\FileDescription";
bSuccess = VerQueryValue(lpData,
(code.toStdWString().c_str()),
&lpBuffer,
&uLen);
if (!bSuccess)
{
qDebug()<<"Get file verstion error!";
}
else
{
str_value="文件说明:" + QString::fromUtf16((const unsigned short int *)lpBuffer)+"\n";
fileInfomation +=str_value;
}
//获得文件版本信息:FileVersion
//-----------------------------------------------------
code ="\\StringFileInfo\\"+ strTranslation +"\\FileVersion";
bSuccess = VerQueryValue(lpData,
(code.toStdWString().c_str()),
&lpBuffer,
&uLen);
if (!bSuccess)
{
qDebug()<<"获取文件版本信息错误!";
}
else
{
str_value="文件版本信息:" + QString::fromUtf16((const unsigned short int *)lpBuffer)+"\n";
fileInfomation +=str_value;
}
//获得文件产品名称
//---------------------------------------------------------
code ="\\StringFileInfo\\"+ strTranslation +"\\ProductName";
bSuccess = VerQueryValue(lpData,
(code.toStdWString().c_str()),
&lpBuffer,
&uLen);
if (!bSuccess)
{
qDebug()<<"Get file ProductName error!";
}
else
{
str_value="产品名称:" + QString::fromUtf16((const unsigned short int *)lpBuffer)+"\n";
fileInfomation +=str_value;
}
//获得产品版本信息:ProductVersion
//-----------------------------------------------------
code ="\\StringFileInfo\\"+ strTranslation +"\\ProductVersion";
bSuccess = VerQueryValue(lpData,
(code.toStdWString().c_str()),
&lpBuffer,
&uLen);
if (!bSuccess)
{
qDebug()<<"获取产品版本信息错误!";
}
else
{
str_value="产品版本信息:" + QString::fromUtf16((const unsigned short int *)lpBuffer)+"\n";
fileInfomation +=str_value;
}
//获得文件内部名称 InternalName
//---------------------------------------------------------
code ="\\StringFileInfo\\"+ strTranslation +"\\InternalName";
bSuccess = VerQueryValue(lpData,
(code.toStdWString().c_str()),
&lpBuffer,
&uLen);
if (!bSuccess)
{
qDebug()<<"Get file InternalName error!";
}
else
{
str_value="内部名称:" + QString::fromUtf16((const unsigned short int *)lpBuffer)+"\n";
fileInfomation +=str_value;
}
//获得原始文件名 OriginalFileName
//---------------------------------------------------------
code ="\\StringFileInfo\\"+ strTranslation +"\\OriginalFileName";
bSuccess = VerQueryValue(lpData,
(code.toStdWString().c_str()),
&lpBuffer,
&uLen);
if (!bSuccess)
{
qDebug()<<"Get file OriginalFileName error!";
}
else
{
str_value="原始文件名:" + QString::fromUtf16((const unsigned short int *)lpBuffer)+"\n";
fileInfomation +=str_value;
}
//获得合法版权 LegalTradeMarks 【Q tea 原创】
//---------------------------------------------------------
code ="\\StringFileInfo\\"+ strTranslation +"\\Type";
bSuccess = VerQueryValue( lpData,
(code.toStdWString().c_str()),
&lpBuffer,
&uLen);
if (!bSuccess)
{
qDebug()<<"Get file LegalTradeMarks error!";
}
else
{
str_value="版权:" + QString::fromUtf16((const unsigned short int *)lpBuffer)+"\n";
fileInfomation +=str_value;
}
delete lpData;
return fileInfomation;
}
【Q tea 原创】
源文件下载地址:https://download.csdn.net/download/scz653037148/10739331