1. 程式人生 > >Qt 獲取exe版本等詳細資訊

Qt 獲取exe版本等詳細資訊

【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 原創】