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

企鹅博客
企鹅博客
企鹅博客
28606
文章
0
评论
2020年9月17日02:30:05 评论 2 views 3593字阅读11分58秒

#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);

继续阅读
weinxin
欢迎加入中国站长博客之家
本站的所有资源都会上传分享到博客之家,希望大家互相学习交流进步。
如何使iPad/iPhone程序满屏显示 Linux编程

如何使iPad/iPhone程序满屏显示

如何使iPad/iPhone程序满屏显示【也就是没有上面的电量条】 先上图: 有时候,我们想让我们的程序满屏,我们该怎么做呢? 步骤如下: 在工程中找到:XXX-Info.plist【其中XXX是你的...
JVM类加载机制以及类缓存问题的处理 Linux编程

JVM类加载机制以及类缓存问题的处理

当一个Java项目启动的时候,JVM会找到main方法,根据对象之间的调用来对class文件和所引用的jar包中的class文件进行加载(其步骤分为加载、验证、准备、解析、初始化、使用和卸载),方法区...
Java静态代码块使用 Linux编程

Java静态代码块使用

一、Java静态代码块与静态方法区别一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下,其他程序来调...
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: