Qt 獲取exe版本等詳細資訊
阿新 • • 發佈:2018-12-17
【El_equilibrio 原創】
核心函式:VerQueryValue
VerQueryValue這個函式用於從版本資源中獲取資訊。呼叫這個函式前,必須先用GetFileVersionInfo函式獲取版本資源資訊。這個函式會檢查資源資訊,並將需要的資料複製到一個緩衝區裡。
【El_equilibrio 原創】
引數 型別及說明
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
【El_equilibrio 原創】
相關函式 傳出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; //獲得檔案基礎資訊 【El_equilibrio 原創】 //-------------------------------------------------------- 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; //以上步驟需按序進行,以下步驟可根據需要增刪或者調整 【El_equilibrio 原創】 //獲得檔案說明: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 【El_equilibrio 原創】 //--------------------------------------------------------- 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; }
【El_equilibrio 原創】