当前位置: 首页 > news >正文

QT获取dll库文件详细信息

一、需求背景

获取软件下依赖的dll库的版本信息,如下图所示版本为1.0.7.1018

二、实现方法

2.1步骤

windows下实现,基于version.lib(version.dll)提供的函数获取这些信息

  1. 首先使用GetFileVersionInfoSizeA(W)获取VersionInfo的大小,申请缓冲区;

  1. 接着使用GetFileVersionInfoA(W)获取VersionInfo数据到缓冲区;

  1. 接着使用VerQueryValueA(W)依次获取\,\VarFileInfo\Translation,再根据Translation获取语言类型,接着\VarFileInfo\080404B0\ProductVersion便获取到了版本信息。

参考:https://www.cnblogs.com/comor/p/10607383.html

2.2 源码

#include <QDebug>
#include <string>
#include <tchar.h>
#include <iostream>
#include <windows.h>BOOL GetFileInfoStringWinApi(LPCTSTR pFileName, LPCTSTR pName /* = NULL */, LPTSTR ptBuf, UINT lenBuf)
{DWORD   dwDummyHandle = 0; // will always be set to zeroDWORD   dwLen = 0;BYTE    *pVersionInfo = NULL;BOOL    bRetVal;VS_FIXEDFILEINFO    FileVersion;HMODULE        hVerDll;hVerDll = LoadLibrary(_T("VERSION.dll"));if (hVerDll == NULL){return FALSE;}#ifdef _UNICODEtypedef DWORD(WINAPI * Fun_GetFileVersionInfoSize)(LPCTSTR, DWORD *);typedef BOOL(WINAPI * Fun_GetFileVersionInfo)(LPCTSTR, DWORD, DWORD, LPVOID);typedef BOOL(WINAPI * Fun_VerQueryValue)(LPCVOID, LPCTSTR, LPVOID, PUINT);
#elsetypedef DWORD(WINAPI * Fun_GetFileVersionInfoSize)(LPCSTR, DWORD *);typedef BOOL(WINAPI * Fun_GetFileVersionInfo)(LPCSTR, DWORD, DWORD, LPVOID);typedef BOOL(WINAPI * Fun_VerQueryValue)(LPCVOID, LPCSTR, LPVOID, PUINT);
#endifFun_GetFileVersionInfoSize        pGetFileVersionInfoSize;Fun_GetFileVersionInfo            pGetFileVersionInfo;Fun_VerQueryValue                pVerQueryValue;#ifdef _UNICODEpGetFileVersionInfoSize = (Fun_GetFileVersionInfoSize)::GetProcAddress(hVerDll, "GetFileVersionInfoSizeW");pGetFileVersionInfo = (Fun_GetFileVersionInfo)::GetProcAddress(hVerDll, "GetFileVersionInfoW");pVerQueryValue = (Fun_VerQueryValue)::GetProcAddress(hVerDll, "VerQueryValueW");
#elsepGetFileVersionInfoSize = (Fun_GetFileVersionInfoSize)::GetProcAddress(hVerDll, "GetFileVersionInfoSizeA");pGetFileVersionInfo = (Fun_GetFileVersionInfo)::GetProcAddress(hVerDll, "GetFileVersionInfoA");pVerQueryValue = (Fun_VerQueryValue)::GetProcAddress(hVerDll, "VerQueryValueA");
#endifstruct TRANSLATION{WORD langID;            // language IDWORD charset;            // character set (code page)} Translation;Translation.langID = 0x0409;    //Translation.charset = 1252;        // default = ANSI code pagedwLen = pGetFileVersionInfoSize(pFileName, &dwDummyHandle);if (dwLen == 0){bRetVal = FALSE;goto End;}pVersionInfo = new BYTE[dwLen]; // allocate version infobRetVal = pGetFileVersionInfo(pFileName, 0, dwLen, pVersionInfo);if (bRetVal == FALSE){goto End;}VOID     *pVI;UINT    uLen;bRetVal = pVerQueryValue(pVersionInfo, _T("\\"), &pVI, &uLen);if (bRetVal == FALSE){goto End;}memcpy(&FileVersion, pVI, sizeof(VS_FIXEDFILEINFO));bRetVal = pVerQueryValue(pVersionInfo, _T("\\VarFileInfo\\Translation"),&pVI, &uLen);if (bRetVal && uLen >= 4){memcpy(&Translation, pVI, sizeof(TRANSLATION));}else{bRetVal = FALSE;goto End;}//  BREAKIF(FileVersion.dwSignature != VS_FFI_SIGNATURE);if (FileVersion.dwSignature != VS_FFI_SIGNATURE){bRetVal = FALSE;goto End;}VOID        *pVal;UINT        iLenVal;if (pName == NULL){_stprintf_s(ptBuf, lenBuf, _T("%d.%d.%d.%d"),HIWORD(FileVersion.dwFileVersionMS), LOWORD(FileVersion.dwFileVersionMS),HIWORD(FileVersion.dwFileVersionLS), LOWORD(FileVersion.dwFileVersionLS));}else{TCHAR    szQuery[1024];_stprintf_s(szQuery, 1024, _T("\\StringFileInfo\\%04X%04X\\%s"),Translation.langID, Translation.charset, pName);bRetVal = pVerQueryValue(pVersionInfo, szQuery, &pVal, &iLenVal);if (bRetVal){_stprintf_s(ptBuf, lenBuf, _T("%s"), (TCHAR *)pVal);}else{_stprintf_s(ptBuf, lenBuf, _T("%s"), _T(""));}}End:FreeLibrary(hVerDll);hVerDll = NULL;delete[] pVersionInfo;pVersionInfo = NULL;return bRetVal;
}bool GetFileInfoString(const QString &fileName, const QString &name, QString &value)
{TCHAR *ptszStr = NULL;ptszStr = new TCHAR[1024];LPCWSTR fileName_wstr = reinterpret_cast<LPCWSTR>(fileName.data());LPCWSTR name_wstr = reinterpret_cast<LPCWSTR>(name.data());BOOL bRet = GetFileInfoStringWinApi(fileName_wstr, name_wstr, ptszStr, 1024);value = QString::fromWCharArray(ptszStr);delete ptszStr;ptszStr = NULL;return bRet;
}QString GetFileProductVersion(const QString &fileName)
{QString version;GetFileInfoString(fileName, "ProductVersion", version);return version;
}

2.3 测试结果

int main(int argc, char *argv[])
{QString fileName = "xxx//CZVisionCameraOperator.dll";qDebug() << GetFileProductVersion(fileName);return 0;
}

2.4 扩展

除版本信息,还可以获取文件说明、产品名称、版权、公司名称、原始文件名称等

FileDescription 文件说明

FileVersion 文件版本

ProductName 产品名称

ProductVersion 产品版本

LegalCopyright 版权

CompanyName 公司名称

OriginalFilename 原始文件名

相关文章:

QT获取dll库文件详细信息

一、需求背景获取软件下依赖的dll库的版本信息&#xff0c;如下图所示版本为1.0.7.1018二、实现方法2.1步骤windows下实现&#xff0c;基于version.lib(version.dll)提供的函数获取这些信息首先使用GetFileVersionInfoSizeA(W)获取VersionInfo的大小&#xff0c;申请缓冲区&…...

常见的电脑运行卡顿原因及解决方法

大家在日常使用电脑过程中&#xff0c;会发现多开几个文件就卡顿&#xff0c;其实很多时候都跟C盘长期不清理有关&#xff0c;C盘的内存被下载的软件安装包、页面文件、休眠文件、更新文件等一系列的文件占据。大的文件甚至能占到20-30G&#xff0c;驱动人生就为大家带来几种解…...

案例08-让软件的使用者成为软件的设计者

一&#xff1a;背景介绍 对于需求的开发每天可能都会有上线的情况&#xff0c;为了防止每次上线拉取代码或者修改配置而引发的冲突以及发生了冲突应该找谁一起确定一下代码留下那一部分的情况。所以在开发的群中会有一个表格来记录每个需求上线修改的环境、是否修改数据库、是否…...

QinQ与Vlan Mapping讲解

目录 QinQ Vlan扩展 QinQ实现方式 QinQ实验配置 Vlan Mapping Vlan映射 映射方式 配置命令 QinQ Vlan扩展 QinQ全称为802.1Q-in-802.1Q&#xff0c;为Vlan扩展技术&#xff0c;在802.1Q标签报文的基础上再增加一层802.1Q标签&#xff0c;实现扩展Vlan空间&#xff1b;可…...

golang 获取token方法

package main import ( "fmt" "time" "github.com/dgrijalva/jwt-go" ) const ( SECRETKEY "202203021124355xxx" //私钥 ) // 自定义 Claims type CustomClaims struct { UserId int64 jwt.StandardClaims } func main() { //生…...

【数据库专题】数据库Mongodb之深入认知云计算三种服务方式、mongodb特点、mongodb重要进程 mongod、mongo、其他进程区别

文章目录一、什么是云计算1. IaaS:基础设施即服务2. SaaS:软件即服务3. PaaS:平台即服务二、大数据与云计算关系三、什么是MongoDB四、大数据与MongoDB五、MongoDB特点六、安装MongoDB七、重要进程介绍7.1 mongod进程7.2 mongo进程7.3 其他进程7.3.1 mongodump重建数据库7.3.2 …...

ccc-pytorch-小实验合集(4)

文章目录一、 Himmelblau 优化二、多分类实战-Mnist三、Sequential与CPU加速-Mnist四、visidom可视化一、 Himmelblau 优化 Himmelblau 是一个具有4个最优值的2维目标函数。其函数和最优值点如下&#xff1a; 图象绘制&#xff1a; import numpy as np from matplotlib impo…...

webrtc音频系列——4、RTP与RTCP协议

如果让你从0开发一套实时互动直播系统&#xff0c;你首先要选择网络传输协议。UDP 还是 TCP&#xff1f;答案是&#xff1a;UDP。为什么实时传输不能用 TCP &#xff1f;TCP 的目的就是实现数据的可靠传输&#xff0c;因此他有一套 握手&#xff0c;发送 -> 确认&#xff0c…...

C++枚举解读(enum)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、枚举是什么&#xff1f;二、使用步骤1.作用域2.隐式类型转换3.显式指定枚举值类型4.指定枚举值的值4.整形显式转换成枚举总结前言 对于开发C来说&#xff0…...

OSCP-课外5(Web图片泄露服务信息、日志中毒)

目录 一、主机发现与端口扫描 二、Web信息收集 三、系统信息收集与提权 一、主机发现与端口扫描...

汇编指令学习(ADD,SUB,MUL,DIV,XADD,INC,DEC,NEG)

一、ADD加法操作指令将eax置1&#xff0c;ebx置2&#xff0c;运行下面命令&#xff0c;将结果保存到eaxadd eax,ebx扩展&#xff1a;adc需要再加上CF标志位的值adc eax&#xff0c;ebx二、SUB减法操作指令将eax置3&#xff0c;ebx置2&#xff0c;运行下面命令&#xff0c;将结果…...

【电源专题】案例:充电芯片损坏为什么判断是从NTC进入的EOS

最近有发现一个异常就是测试部测试测试然后充电芯片就无法使用了。通过二极管特性分析(参考文章:电源专题】案例:电源芯片厂家怎么判断电源芯片端口是否损坏)是NTC管脚已经损坏对地短路了。但是以前没有发现这个问题,最近更换了芯片后就发现的特别明显。 首先分析一下现在…...

C语言中的数据储存规则

写在开头 关于复习的相关内容其实从一开始就列出了大纲&#xff0c;但是迟迟没有开始复习&#xff0c;一方面是因为学校学业却是繁忙&#xff0c;另一方面还是内心对旧知识掌握不熟练需要再学一遍的畏惧和懒惰&#xff0c;但如今&#xff0c;复习必须开始了。今天我从C语言的最…...

Android kotlin实战之协程suspend详解与使用

前言 Kotlin 是一门仅在标准库中提供最基本底层 API 以便各种其他库能够利用协程的语言。与许多其他具有类似功能的语言不同&#xff0c;async 与 await 在 Kotlin 中并不是关键字&#xff0c;甚至都不是标准库的一部分。此外&#xff0c;Kotlin 的 挂起函数 概念为异步操作提供…...

Pycharm中的Virtualenv Environment、Conda Environment

版本一 Conda Environment该不该选? 先说结论&#xff0c;该选&#xff0c;而且还是正解。前提是你打算"用Anaconda来管理各种Python环境&#xff0c;同时管理Python下面的各种包"。 选了Conda Environment意味着什么? 意味着你以后如果要装新的包的话&#xf…...

C++容器介绍:vector

目录vector简介使用方法1.头文件2.vector声明及初始化3.vector基本操作(1). 容量(2). 修改(3)迭代器(4)元素的访问(5)算法vector 简介 vector是表示可变大小数组的序列容器。就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vecto…...

抗锯齿和走样(笔记)

Artifacts&#xff08;瑕疵&#xff09;&#xff1a; 比如人眼采样频率跟不上陀螺的旋转速度&#xff0c;这时就有可能看到陀螺在反方向旋转怎么做抗锯齿&#xff08;滤波&#xff09;&#xff1a; 在采样之前先进行一个模糊操作&#xff0c;可以降低锯齿的明显程度 通过傅里叶…...

线程池的使用——线程池的创建方式

线程池的使用——创建线程线程池的创建线程池的创建方式Executors.newFixedThreadPool&#xff1a;Executors.newCachedThreadPool&#xff1a;Executors.newSingleThreadExecutor&#xff1a;Executors.newScheduledThreadPool&#xff1a;Executors.newSingleThreadScheduled…...

代码随想录算法训练营day47 |动态规划 198打家劫舍 213打家劫舍II 337打家劫舍III

day47198.打家劫舍1.确定dp数组&#xff08;dp table&#xff09;以及下标的含义2.确定递推公式3.dp数组如何初始化4.确定遍历顺序5.举例推导dp数组213.打家劫舍II情况一&#xff1a;考虑不包含首尾元素情况二&#xff1a;考虑包含首元素&#xff0c;不包含尾元素情况三&#x…...

项目设计模式和规范

1、责任链模式 自己的理解:避免发生方与接收方解耦 优点:①降低发送方与接收方的耦合 ②简化他们对象 ③方便扩展新增 处理者 缺点:①不方便排错 ②性能问题,且使用不当容易搞出死循环 应用场景:拦截器 Interceptor和过滤器 filter:符合模式的进行拦截或者过滤到,然…...

实用扩散模型完整指南:100行代码实现高效图像生成

实用扩散模型完整指南&#xff1a;100行代码实现高效图像生成 【免费下载链接】Diffusion-Models-pytorch Pytorch implementation of Diffusion Models (https://arxiv.org/pdf/2006.11239.pdf) 项目地址: https://gitcode.com/gh_mirrors/di/Diffusion-Models-pytorch …...

如何用stressapptest进行高效内存和磁盘压力测试?实战案例分享

如何用stressapptest进行高效内存和磁盘压力测试&#xff1f;实战案例分享 在服务器运维和硬件性能评估中&#xff0c;内存和磁盘的稳定性直接关系到系统的可靠性。想象一下&#xff0c;当你的服务器在凌晨三点突然因为内存错误崩溃&#xff0c;或者磁盘在高峰期出现读写异常&a…...

AI结对编程:借助快马平台智能生成qclaw官网的AI功能模块

最近在开发qclaw官网时&#xff0c;尝试用AI辅助完成了一个合同条款分析功能&#xff0c;整个过程比想象中顺畅很多。这个功能的核心是让用户输入合同文本后&#xff0c;自动评估风险等级并给出提示。下面分享下具体实现思路和与AI协作的实践经验。 功能设计要点 首先明确这个…...

OpenClaw资源监控方案:Qwen3-32B镜像驱动服务器健康巡检

OpenClaw资源监控方案&#xff1a;Qwen3-32B镜像驱动服务器健康巡检 1. 为什么需要AI驱动的资源监控&#xff1f; 去年我的个人开发服务器连续宕机三次&#xff0c;每次都是因为磁盘写满导致服务崩溃。传统监控工具虽然能发出警报&#xff0c;但往往在问题发生后才会触发&…...

Anaconda Prompt卡在solving environment?别慌,三步搞定清华镜像源配置(附.condarc文件)

Anaconda环境配置卡顿&#xff1f;清华镜像源优化全指南 刚接触Python数据科学的新手们&#xff0c;十有八九会在Anaconda环境配置这一步栽跟头。特别是当看到命令行窗口里"solving environment"的提示一直转圈却迟迟没有进展时&#xff0c;那种等待的煎熬简直让人抓…...

AI 开发实战:AI 成本监控怎么做,团队才不会越用越贵

AI 开发实战&#xff1a;AI 成本监控怎么做&#xff0c;团队才不会越用越贵 一、这个问题为什么值得专门拿出来做&#xff1f; 在 AI 工程落地里&#xff0c;真正拖慢团队的往往不是模型本身&#xff0c;而是流程和协作方式没有跟上。 围绕“AI 成本监控怎么做&#xff0c;团…...

Outfit字体全攻略:5大核心优势与零基础实战指南

Outfit字体全攻略&#xff1a;5大核心优势与零基础实战指南 【免费下载链接】Outfit-Fonts The most on-brand typeface 项目地址: https://gitcode.com/gh_mirrors/ou/Outfit-Fonts Outfit字体作为一款专业的开源无衬线字体&#xff0c;凭借其完整的9种字重体系和现代设…...

ChatClient 全家桶保姆级博客讲解

最近 Spring AI 迭代很快&#xff0c;从原来的 ChatModel 转向了更易用的 ChatClient API。如果你看到这串名词&#xff1a;ChatClient、default、Options、Functions、Tools、System&User、Advisors&#xff0c;肯定会说好多名词啊。不急&#xff0c;慢慢来。一、先搞懂&a…...

HP-Socket技术债务管理会议决策记录:选项、理由与结果

HP-Socket技术债务管理会议决策记录&#xff1a;选项、理由与结果 【免费下载链接】HP-Socket High Performance TCP/UDP/HTTP Communication Component 项目地址: https://gitcode.com/gh_mirrors/hp/HP-Socket 作为一款高性能TCP/UDP/HTTP通信组件库&#xff0c;HP-So…...

Fish-Speech-1.5开源模型的企业级部署架构设计

Fish-Speech-1.5开源模型的企业级部署架构设计 如果你正在考虑将Fish-Speech-1.5这个强大的语音合成模型引入到自己的业务中&#xff0c;比如做个智能客服、有声书平台&#xff0c;或者给产品加个语音播报功能&#xff0c;那你肯定不能只满足于在本地电脑上跑个Demo。一旦涉及…...