using static vs版本_Qt开源小项目--查看dll,exe的版本信息

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

先上图看看效果:

0ffdb6d217df9bf3922f1e7dc4e7d6a4.gif

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

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

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

#include "dolproductinfo.h"

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

#include "..commoncommon.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, 
                        ("VarFileInfoTranslation"), 
                        (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下。关注微信公众号获取源码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值