Qt开源小项目--查看dll,exe的版本信息

  1. Qt开源小项目–查看dll,exe的版本信息

Qt开源小项目–查看dll,exe的版本信息

先上图看看效果:
image

在工作可能经常遇到的对文件的签名,dll和exe中所带的信息进行提取和验证。所以我就
封装成一个类,以后直接调用了,非常的方便。大家拿到这个类就可以直接使用在项目中。

这里我就贴出主要的代码,我会把完整的项目放到github上面。

/****************************************************************************
**
** Copyright (C) 2018 liushixiong (liushixiongcpp@163.com)
** All rights reserved.
**
****************************************************************************/

#include "dolproductinfo.h"

#include <wincrypt.h>
#include <wintrust.h>

#include "..\common\common.h"

#pragma comment(lib, "crypt32.lib")

#define ENCODING (X509_ASN_ENCODING | PKCS_7_ASN_ENCODING)

const int LINE_BUFFER_SIZE = 2048;

dolProductInfo::dolProductInfo(const string &pFilePath, bool pIsInit)
    : mFilePath(pFilePath)
{
    if (pIsInit) { Init(); }
}

dolProductInfo::~dolProductInfo()
{
}

bool dolProductInfo::Init()
{
    DWORD temp;
    UINT size;
    char tempbuf[LINE_BUFFER_SIZE] = { 0 };

    HANDLE hFile = CreateFileA(mFilePath.c_str(), GENERIC_READ, 
                                FILE_SHARE_READ, NULL, 
                                OPEN_EXISTING, 0, NULL);
    if (hFile == INVALID_HANDLE_VALUE) { return false; }

    char szMZHader[0x40];
    char szMewHader[0x1000];
    DWORD read;
    bool result = ReadFile(hFile, szMZHader, 0x40, &read, NULL);
    if (! result || read != 0x40) {
        return false;
    }

    DWORD filesize = GetFileSize(hFile, NULL);
    FormatDWord(filesize, tempbuf);
    mSize = tempbuf;
    mSize += " Bytes";
    ZeroMemory(tempbuf, LINE_BUFFER_SIZE);

    FILETIME ftCreation, ftModified;
    GetFileTime(hFile, &ftCreation, NULL, &ftModified);
    FormatFileTime(ftCreation, tempbuf);
    mCreationTime = tempbuf;
    ZeroMemory(tempbuf, LINE_BUFFER_SIZE);
    FormatFileTime(ftModified, tempbuf);
    mModifiedTime = tempbuf;
    ZeroMemory(tempbuf, LINE_BUFFER_SIZE);

    CloseHandle(hFile);

    if ((size = GetFileVersionInfoSizeA(mFilePath.c_str(), &temp)) < 0) {
        return false;
    }

    char *buf = new char[size];
    char *str;
    char szLang1[20];

    if (! GetFileVersionInfoA(mFilePath.c_str(), 0, size, buf)) {
        delete[] buf;
        return false;
    }

    VS_FIXEDFILEINFO *info;
    if (VerQueryValueA((LPVOID)buf, ("\\"), (LPVOID *)&info, &size)) {
        string retvalue;
        mType = GetFileType(info->dwFileType, retvalue);

        sprintf_s(tempbuf, LINE_BUFFER_SIZE, "%d.%d.%d.%d", 
                    (info->dwFileVersionMS >> 16), 
                    (info->dwFileVersionMS & 65535), 
                    (info->dwFileVersionLS >> 16), 
                    info->dwFileVersionLS & 65535);
        mFileVersion = tempbuf;
        ZeroMemory(tempbuf, LINE_BUFFER_SIZE);

        sprintf_s(tempbuf, LINE_BUFFER_SIZE, "%d.%d.%d.%d", 
                    (info->dwProductVersionMS >> 16), 
                    (info->dwProductVersionMS & 65535), 
                    (info->dwProductVersionLS >> 16), 
                    info->dwProductVersionLS & 65535);
        mProductVersion = tempbuf;
        ZeroMemory(tempbuf, LINE_BUFFER_SIZE);
    }

    if (! VerQueryValueA((LPCVOID)buf, 
                        ("\\VarFileInfo\\Translation"), 
                        (LPVOID *)&str, &size)) {
        // return false;
    }

    sprintf_s(szLang1, sizeof(szLang1)/sizeof(char), 
                "%4.4X%4.4X", 
                *(unsigned short *)str, 
                *(unsigned short *)(str+2));


    // 如果采用unicode读取失败,就在用mult char在读取一次
    result = GetInfoStr(buf, szLang1, "ProductName", tempbuf);
    if (! result) {
        ZeroMemory(szLang1, 20);    
        sprintf_s(szLang1, sizeof(szLang1)/sizeof(char), 
                    "%4.4X%4.4X", 
                    *(unsigned short *)str, 
                    0x4E4);

        if (GetInfoStr(buf, szLang1, "ProductName", tempbuf)) {
            mProductName = tempbuf;
            ZeroMemory(tempbuf, LINE_BUFFER_SIZE);
        }
    } else {
        mProductName = tempbuf;
        ZeroMemory(tempbuf, LINE_BUFFER_SIZE);
    }


    if (GetInfoStr(buf, szLang1, "FileDescription", tempbuf)) {
        mFileDescription = tempbuf;
        ZeroMemory(tempbuf, LINE_BUFFER_SIZE);
    }

    if (GetInfoStr(buf, szLang1, "CompanyName", tempbuf)) {
        mCompanyName = tempbuf;
        ZeroMemory(tempbuf, LINE_BUFFER_SIZE);
    }

    if (GetInfoStr(buf, szLang1, "LegalCopyRight", tempbuf)) {
        mCopyRight = tempbuf;
        ZeroMemory(tempbuf, LINE_BUFFER_SIZE);
    }

    if (GetInfoStr(buf, szLang1, "OriginalFileName", tempbuf)) {
        mOriginName = tempbuf;
        ZeroMemory(tempbuf, LINE_BUFFER_SIZE);
    }

    string signstr = QueryDigSignature(); 

    delete[] buf;
    return true;
}

string dolProductInfo::GetFileType(DWORD pdwFileType, string &pszFileType)
{
    const int count = 7;
    KEY_VALUE FilesTypes[count] = {
        { VFT_UNKNOWN, "Unkown" },
        { VFT_APP, "Application" },
        { VFT_DLL, "Dynamic-Link Library" },
        { VFT_DRV, "Device Driver" },
        { VFT_FONT,"Font" },
        { VFT_VXD, "Virtual Device" },
        { VFT_STATIC_LIB, "Static-Link Library" }
    };

    return KeyValueToStr(FilesTypes, count, pdwFileType, pszFileType);
}

string dolProductInfo::GetFilePath() const
{
    return mFilePath;
}
void dolProductInfo::SetFilePath(const string &pFilePath)
{
    mFilePath = pFilePath;
}

string dolProductInfo::GetFileDescription() const
{
    return mFileDescription;
}

void dolProductInfo::SetFileDescription(const string &pFileDescription)
{
    mFileDescription = pFileDescription;
}

string dolProductInfo::GetDigSignature() const
{
    return mDigSignature;
}

void dolProductInfo::SetDigSignature(const string &pDigSignature)
{
    mDigSignature = pDigSignature;
}

string dolProductInfo::GetType() const
{
    return mType;
}

看了代码,觉得有用的。github可以start下。
https://github.com/MingYueRuYa/worktool


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 635672377@qq.com

文章标题:Qt开源小项目--查看dll,exe的版本信息

文章字数:682

本文作者:刘世雄

发布时间:2020-06-11, 20:21:26

最后更新:2020-06-11, 12:24:20

原始链接:http://lsxcpp.com/2020/06/12/Qt%E5%BC%80%E6%BA%90%E5%B0%8F%E9%A1%B9%E7%9B%AE-%E6%9F%A5%E7%9C%8Bdll%EF%BC%8Cexe%E7%9A%84%E7%89%88%E6%9C%AC%E4%BF%A1%E6%81%AF/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录