Qt 获取exe版本等详细信息

【Q tea 原创】 

    核心函数:VerQueryValue 

     VerQueryValue这个函数用于从版本资源中获取信息。调用这个函数前,必须先用GetFileVersionInfo函数获取版本资源信息。这个函数会检查资源信息,并将需要的数据复制到一个缓冲区里。

【Q tea 原创】    

参数 类型及说明

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

【Q tea 原创】

相关函数 传出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;
    //获得文件基础信息 【Q tea  原创】
    //--------------------------------------------------------
    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;
    //以上步骤需按序进行,以下步骤可根据需要增删或者调整

    【Q tea  原创】
    //获得文件说明: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 【Q tea  原创】
    //---------------------------------------------------------
    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;
}

【Q tea 原创】 

源文件下载地址:https://download.csdn.net/download/scz653037148/10739331

发布了8 篇原创文章 · 获赞 5 · 访问量 5449
展开阅读全文
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符

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

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览