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

Qt:

#include<windows.h>

#include<winver.h>

///引入Version.lib库

QString InfomationCollect::GetFileVertion( QString fullName )
{
// 必须要用,不然无法获取到exe的版本信息
<span style="white-space:pre">	</span>#pragma comment(lib, "Version")
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);

转载至:

http://www.thinksaas.cn/topics/0/87/87160.html


关于GetFileVersionInfoSize,GetFileVersionInfo,VerQueryValue 这3个WINAPI函数:

/******************************************************************************************************************************************************
	** GetFileVersionInfoSize,GetFileVersionInfo,VerQueryValue WINAPI函数
	** GetFileVersionInfoSize函数用于判断系统能否检索到指定文件的版本信息,如果版本信息可以检索到,
	** 函数返回版本信息的字节大小(https://msdn.microsoft.com/en-us/library/windows/desktop/ms647005(v=vs.85).aspx)
	**		 DWORD WINAPI GetFileVersionInfoSize(
	**		_In_      LPCTSTR lptstrFilename,	// String,包含了版本资源的一个文件的名字
	**		_Out_opt_ LPDWORD lpdwHandle);		// Long,在这个变量中载入0值,lpdwHandle参数在win32中已经放弃,直接给0就可以了
	**
	**
	** GetFileVersionInfo函数用来获得指定文件的版本信息(http://www.office-cn.net/t/api/getfileversioninfo.htm)
	**		BOOL WINAPI GetFileVersionInfo(
	**		_In_       LPCTSTR lptstrFilename, // String,文件名称,包含绝对路径:"c:\GetVersion.exe"
	**		_Reserved_ DWORD   dwHandle,	   // Long,MSDN说:该参数可被忽略
	**		_In_       DWORD   dwLen,		   // Long,由lpData参数指定的字节数组或缓冲区的大小。用GetFileVersionInfoSize函数判断要求的缓冲区长度有多大
	**		_Out_      LPVOID  lpData);		   // Byte,指定一个字节缓冲区的第一个字节。该缓冲区用于装载文件的版本信息
	**
	**
	** VerQueryValue这个函数用于从指定的版本信息资源检索指定的版本信息。调用这个函数前,必须先用GetFileVersionInfo
	** 函数获取适当的资源信息。(https://msdn.microsoft.com/en-us/library/windows/desktop/ms647464(v=vs.85).aspx)
	**		BOOL WINAPI VerQueryValue(
	**		_In_  LPCVOID pBlock,      // Byte,调用GetFileVersionInfo函数,返回的版本信息资源。
	**		_In_  LPCTSTR lpSubBlock,  // String,名称的字符串必须包含反斜杠隔开,它必须有下列形式之一
	**											"\"根,函数获取一个指向VS_FIXEDFILEINFO版本信息资源的结构的指针;
	**											"\VarFileInfo\Translation" 获取一个指向语言和代码页标识符数组的指针;
	**											"\StringFileInfo\lang-codepage\string-name" 函数获取一个表示特定语言和代码页的字符串值
	**		_Out_ LPVOID  *lplpBuffer, // Long,指定一个Long变量的地址,该变量用于装载一个缓冲区的地址。请求的版本信息最终会装载到那个缓冲区里
	**		_Out_ PUINT   puLen);	   // Long,指定由lplpBuffer参数引用的数据值的长度,以字节为单位
	**************************************************************************************************************************************************************/
	

我也是从MSDN上一点点查到的。- -!















发布了14 篇原创文章 · 获赞 8 · 访问量 3万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 深蓝海洋 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览