您的位置:首页 > 编程语言 > Qt开发

QT用API获得文件的版本信息

2015-09-21 15:04 477 查看
http://www.thinksaas.cn/group/topic/87160/

#include<windows.h>

#include<winver.h>

///引入Version.lib库

QString InfomationCollect::GetFileVertion( QString fullName )
{
DWORD dwLen = 0;
char* lpData=NULL;

BOOL bSuccess = FALSE;
QString fileInfomation;
//获得文件基础信息
//--------------------------------------------------------
dwLen = GetFileVersionInfoSize(fullName.toStdWString().c_str(), 0);
if (0 == dwLen)
{
//qDebug()<<"Get file verstion error!";
return"";
}
lpData =new char [dwLen+1];

bSuccess = GetFileVersionInfo(fullName.toStdWString().c_str(), 0, dwLen, lpData);
if (!bSuccess)
{
//qDebug()<<"Get file verstion error!";
delete lpData;
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 code ="\StringFileInfo\"+ strTranslation +"\FileVersion";
bSuccess = VerQueryValue(lpData,
(code.toStdWString().c_str()),
&lpBuffer,
&uLen);
if (!bSuccess)
{
//qDebug()<<"Get file verstion error!";
delete lpData;
return"";
}
fileInfomation += QString::fromUtf16((const unsigned short int *)lpBuffer);
//获得文件的描述
//---------------------------------------------------------
/*code ="\StringFileInfo\"+ strTranslation +"\FileDescription";
bSuccess = VerQueryValue(lpData,
(code.toStdWString().c_str()),
&lpBuffer,
&uLen);
if (!bSuccess)
{
qDebug()<<"Get file verstion error!";
delete lpData;
return"";
}
fileInfomation +="^";
fileInfomation += QString::fromUtf16((const unsigned short int *)lpBuffer);*/
delete [] lpData;//此处不需要释放
return fileInfomation;
}

//==================================================

//VC版本

char* szFileName = “C:\EnochShen.exe”;
DWORD dwSize = GetFileVersionInfoSize(szFileName,NULL);
LPVOID pBlock = malloc(dwSize);
GetFileVersionInfo(szFileName,0,dwSize,pBlock);

char* pVerValue = NULL;
UINT nSize = 0;
VerQueryValue(pBlock,TEXT(“\VarFileInfo\Translation”),
(LPVOID*)&pVerValue,&nSize);

CString strSubBlock,strTranslation,strTemp;
strTemp.Format(“000%x”,*((unsigned short int *)pVerValue));
strTranslation = strTemp.Right(4);
strTemp.Format(“000%x”,*((unsigned short int *)&pVerValue[2]));
strTranslation += strTemp.Right(4);
//080404b0为中文,040904E4为英文

//文件描述
strSubBlock.Format(“\StringFileInfo\%s\FileDescription”,strTranslation);
VerQueryValue(pBlock,strSubBlock.GetBufferSetLength(256),(LPVOID*)&pVerValue,&nSize);
strSubBlock.ReleaseBuffer();
strTemp.Format(“文件描述: %s”,pVerValue);
AfxMessageBox(strTemp);

//内部名称
strSubBlock.Format(“\StringFileInfo\%s\InternalName”,strTranslation);
VerQueryValue(pBlock,strSubBlock.GetBufferSetLength(256),(LPVOID*)&pVerValue,&nSize);
strSubBlock.ReleaseBuffer();
strTemp.Format(“文件描述: %s”,pVerValue);
AfxMessageBox(strTemp);

//合法版权
strSubBlock.Format(“\StringFileInfo\%s\LegalTradeMarks”,strTranslation);
VerQueryValue(pBlock,strSubBlock.GetBufferSetLength(256),(LPVOID*)&pVerValue,&nSize);
strSubBlock.ReleaseBuffer();
strTemp.Format(“合法版权: %s”,pVerValue);
AfxMessageBox(strTemp);

//原始文件名
strSubBlock.Format(“\StringFileInfo\%s\OriginalFileName”,strTranslation);
VerQueryValue(pBlock,strSubBlock.GetBufferSetLength(256),(LPVOID*)&pVerValue,&nSize);
strSubBlock.ReleaseBuffer();
strTemp.Format(“原始文件名: %s”,pVerValue);
AfxMessageBox(strTemp);

//产品名称
strSubBlock.Format(“\StringFileInfo\%s\ProductName”,strTranslation);
VerQueryValue(pBlock,strSubBlock.GetBufferSetLength(256),(LPVOID*)&pVerValue,&nSize);
strSubBlock.ReleaseBuffer();
strTemp.Format(“产品名称: %s”,pVerValue);
AfxMessageBox(strTemp);

//产品版本
strSubBlock.Format(“\StringFileInfo\%s\ProductVersion”,strTranslation);
VerQueryValue(pBlock,strSubBlock.GetBufferSetLength(256),(LPVOID*)&pVerValue,&nSize);
strSubBlock.ReleaseBuffer();
strTemp.Format(“产品版本: %s”,pVerValue);
AfxMessageBox(strTemp);

free(pBlock);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: