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