首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在C++中获取DLL文件的版本信息

在C++中获取DLL文件的版本信息,可以使用Windows API函数GetFileVersionInfoVerQueryValue。以下是一个简单的示例代码:

代码语言:cpp
复制
#include<iostream>
#include<string>
#include<windows.h>
#include <winver.h>

using namespace std;

bool GetDLLVersionInfo(const string& dllPath, string& versionInfo)
{
    DWORD dwHandle;
    UINT dwLen;
    LPVOID lpData;
    VS_FIXEDFILEINFO* pFileInfo;

    // 获取文件版本信息
    dwLen = GetFileVersionInfoSize(dllPath.c_str(), &dwHandle);
    if (dwLen == 0)
    {
        cout << "GetFileVersionInfoSize failed: "<< GetLastError()<< endl;
        return false;
    }

    lpData = malloc(dwLen);
    if (!GetFileVersionInfo(dllPath.c_str(), dwHandle, dwLen, lpData))
    {
        cout << "GetFileVersionInfo failed: "<< GetLastError()<< endl;
        free(lpData);
        return false;
    }

    // 获取VS_FIXEDFILEINFO结构体
    if (!VerQueryValue(lpData, "\\", (LPVOID*)&pFileInfo, &dwLen))
    {
        cout << "VerQueryValue failed: "<< GetLastError()<< endl;
        free(lpData);
        return false;
    }

    // 获取文件版本信息
    int major = (pFileInfo->dwFileVersionMS >> 16) & 0xFFFF;
    int minor = (pFileInfo->dwFileVersionMS >> 0) & 0xFFFF;
    int build = (pFileInfo->dwFileVersionLS >> 16) & 0xFFFF;
    int revision = (pFileInfo->dwFileVersionLS >> 0) & 0xFFFF;

    // 格式化版本信息字符串
    versionInfo = to_string(major) + "." + to_string(minor) + "." + to_string(build) + "." + to_string(revision);

    free(lpData);
    return true;
}

int main()
{
    string dllPath = "C:\\path\\to\\your\\dll.dll";
    string versionInfo;

    if (GetDLLVersionInfo(dllPath, versionInfo))
    {
        cout << "DLL version: "<< versionInfo<< endl;
    }
    else
    {
        cout << "Failed to get DLL version."<< endl;
    }

    return 0;
}

该示例代码首先调用GetFileVersionInfoSizeGetFileVersionInfo函数获取DLL文件的版本信息,然后调用VerQueryValue函数获取VS_FIXEDFILEINFO结构体,最后根据结构体中的信息格式化版本信息字符串。

注意:在使用该示例代码时,需要将dllPath变量设置为目标DLL文件的路径。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

何在代码获取Java应用当前版本号?

最近需要在项目中获取项目的版本号,最笨方法莫过于硬编码一个版本号,当然我也是这么干。不过闲下来时候突发奇想Spring Boot项目中pom.xml定义版本号能不能通过API获得呢?...在META-INF文件夹中找到了两个相关东西,一个是MANIFEST.MF: Manifest-Version: 1.0 Spring-Boot-Classpath-Index: BOOT-INF/classpath.idx...从配置文件读取 Maven在构建项目时可以通过资源插件将构建属性即pom.xml属性注入到指定资源文件,具体操作为: ... <!...Spring Boot提供 Spring Boot其实已经内置了获取项目构建信息自动配置ProjectInfoAutoConfiguration,它包含一个条件BeanBuildProperties:...spring-boot-version", "time" : { "epochSecond" : 1620664643, "nano" : 591000000 } } 总结 今天介绍了几种从通过API获取项目构建版本信息方法

3.1K20

何在代码获取Java应用当前版本号?

最近需要在项目中获取项目的版本号,最笨方法莫过于硬编码一个版本号,当然我也是这么干。不过闲下来时候突发奇想Spring Boot项目中pom.xml定义版本号能不能通过API获得呢?...在META-INF文件夹中找到了两个相关东西,一个是MANIFEST.MF: Manifest-Version: 1.0 Spring-Boot-Classpath-Index: BOOT-INF/classpath.idx...从配置文件读取 Maven在构建项目时可以通过资源插件将构建属性即pom.xml属性注入到指定资源文件,具体操作为: ... <!...Spring Boot提供 Spring Boot其实已经内置了获取项目构建信息自动配置ProjectInfoAutoConfiguration,它包含一个条件BeanBuildProperties:...spring-boot-version", "time" : { "epochSecond" : 1620664643, "nano" : 591000000 } } 总结 今天介绍了几种从通过API获取项目构建版本信息方法

5.7K20

何在H264码流SPS获取宽和高信息

前言 了解H264视频编码格式小伙伴都知道,H264编码存在两个非常重要参数集。...没错,它们就是序列参数集(SPS)和图像参数集(PPS),而且通常情况下,PPS会依赖SPS部分参数信息,同时,视频码流宽高信息也存储在SPS。...那么如何从中获取视频宽高信息呢,就是今天本文主要内容。 正文 一、SPS结构 对H264码流进行解码时,肯定会用到SPS相关参数,因此,我们非常有必要了解其中参数含义。...(15) vui_parameters_present_flag 标识位,说明SPS是否存在VUI信息。...也就是SPS类型标识,伪代码如下: data[3] & 0x1f == 7 data[4] & 0x1f == 7 SPS 对于H264而言,就是编码后第一帧,如果是读取H264文件,就是第一个帧界定符和第二个帧界定符之间数据

2.7K10

何在 MSBuild 项目文件 csproj 获取绝对路径

通常我们能够在 csproj 文件仅仅使用相对路径就完成大多数编译任务。但是有些外部命令执行需要用到绝对路径,或者对此外部工具来说,相对路径具有不同含义。...本文介绍如何在项目文件 csproj 中将一个相对路径转换为绝对路径。...在 MSBuild 4.0 ,可以在 csproj 编写调用 PowerShell 脚本代码,于是获取一个路径绝对路径就非常简单: 1 [System.IO.Path]::GetFullPath...('$(WalterlvRelativePath)') 具体到 csproj 代码,是这样: 1 2 3 4 5 6 ...你可以阅读我其他篇博客了解到 $(OutputPath) 其实最终都会是相对路径: 项目文件已知属性(知道了这些,就不会随便在 csproj 写死常量啦) - walterlv 如何更精准地设置

21030

何在 Go 函数获取调用者函数名、文件名、行号...

如果让我们用 Go 设计一个Log Facade,就需要我们自己在门面里获取调用者函数名、文件位置了,那么在Go里面怎么实现这个功能呢?...) Caller 函数会报告当前 Go 程序调用栈所执行函数文件和行号信息。...、该调用在文件行号。...获取调用者函数名 runtime.Caller 返回值第一个返回值是一个调用栈标识,通过它我们能拿到调用栈函数信息 *runtime.Func,再进一步获取到调用者函数名字,这里面会用到函数和方法如下...总结 今天介绍了通过 runtime.Caller 回溯调用栈获取调用者信息方法,虽然强大,不过频繁获取这个信息也是会对程序性能有影响。

6.2K20

浏览器通过webgl获取渲染器供应商和版本信息

对于开发者来说,了解用户使用浏览器供应商和版本信息至关重要,因为不同浏览器可能会有不同渲染器,这可能会对网页显示和功能产生影响。而在浏览器,WebGL是一种用于在网页上呈现3D图形技术。...如果我们想要获取浏览器WebGL渲染器供应商和版本信息,可以使用WebGLRenderingContextgetExtension方法来获取WEBGL_debug_renderer_info扩展。...获取WebGL渲染器供应商和版本信息我们需要获取WebGLRenderingContext实例。...在WEBGL_debug_renderer_info扩展,有两个常量可以用于获取供应商和渲染器信息,分别是UNMASKED_VENDOR_WEBGL和UNMASKED_RENDERER_WEBGL。...这对于开发基于webgl图形应用程序或游戏非常有用,因为它可以提供有关浏览器支持webgl版本重要信息

22910

如何绕过某讯手游保护系统并从内存获取Unity3D引擎Dll文件

这里主要讲一下如何去从内存获取Assembly-CSharp.dll 和 Assembly-CSharp-fristpass.dll文件。...获取文件结果如下: ​ 接下来可直接使用get_dll_from_bin.exe这个工具直接从所有的bin文件dump出所有的dll文件。...结果下图(本次获取到12个dll 文件): ​  工具获取dll后直接使用数字命名,直接通过dnspy打开看看是否有最终目标dll获取dll如下: ​ 并不存在所需要获取dll文件。...经过操作后获取到如下Dll: ​ 通过与解包后资源文件大小相比较,3.dll大小和Assembly-CSharp.dll相同。...分别将3.dll 和12.dll文件拖入dnspy,如图所示3.dll是目标文件Assembly-CSharp.dll: ​ 12.dll是Assembly-CSharp-fristpass.dll

22910

何在 asp.net core 3.x startup.cs 文件获取注入服务

必定会造成之前某些写法没办法继续使用,趁着端午节假期,在改造模板时,发现没办法通过构造函数注入形式在 Startup 文件中注入某些我需要服务了,因此本篇文章主要介绍如何在 asp.net core...3.x startup 文件获取注入服务 二、Step by Step 2.1、问题案例 这个问题发现源于我需要改造模型验证失败时返回错误信息,如果你有尝试的话,在 3.x 版本你会发现在...30 而在 asp.net core ,因为会自动进行模型验证,当不符合 dto 属性要求时,接口会自动返回错误信息,默认返回信息如下图所示 ?...,而服务定位则是我们已经知道存在这个服务了,从容器获取出来然后由自己手动创建实例 虽然服务定位是一种反模式,但是在某些情况下,我们又不得不采用 这里对于本篇文章开篇需要解决问题,我也是采用服务定位方式...,通过构建一个 ServiceProvider 之后,手动从容器获取需要使用服务实例,调整后代码如下 /// /// 添加自定义模型验证失败时返回错误信息 /// </summary

2.1K30

【DB笔试面试797】在Oracle,可以从exp出来dmp文件获取哪些信息

♣ 题目部分 在Oracle,可以从exp出来dmp文件获取哪些信息? ♣ 答案部分 在开发中常常碰到,需要导入dmp文件到现有数据库。...这里dmp文件可能来自于其它系统,所以,一般情况下是不知道导出程序(exp)版本、导出时间或者导出模式等信息。那么如何从现有的dmp文件获取到这些信息呢?下面作者将一一讲解。...(一)获取基本信息:导出版本、时间、导出用户 下面的示例exp_ddl_lhr_02.dmp是生成dmp文件: [ZFZHLHRDB1:oracle]:/tmp>strings exp_ddl_lhr...UNUSED (二)获取dmp文件信息 下面的示例,exp_ddl_lhr_02.dmp是生成dmp文件: [ZFZHLHRDB1:oracle]:/tmp>strings exp_ddl_lhr...如果将US7ASCII字符集dmp文件导入到ZHS16GBK字符集数据库,那么还需要根据文件修改第4行第3-4个字节(即07 D0之前2个字节)。 修改前: ? 修改后: ?

2.4K30

白加黑免杀制作(详细)

,但是当我真正尝试时候才发现很多问题,: 网上关于如何编写 dll 资料不全或太过片面 在 dll dllmain 函数执行 shellcode 导致死锁 如何在 dll 截取主线程直接上线...本文就会从 dll 开发基础讲起,如何开发和调试 dll,到如何在 dll 中上线木马,dllmain 中上线与 exe 上线不同,如何在 dll 导出函数执行上线,以及可能遇见问题如何解决等。...(3)dllmain.cpp 文件 dllmain.cpp 文件包含程序入口点,在 dllmain.cpp 实现在 pch.h 定义函数,当然也可以在其他 cpp 文件实现, pch.cpp...静态链接库(.lib) 在编译动态链接库(.dll)时还会输出相应静态链接库(.lib): lib 文件包含一些索引信息,记录了 dll 函数入口和位置,lib 用于在开发编译时使用,dll 则在运行时使用...(1)导出函数名修饰规则 C 和 C++ 导出函数名修饰规则不同,根据不同调用约定有不同修饰方法,见下表: 可以看到 C++ 比 C 函数名修饰规则复杂了很多,但也能传递更多信息

3.7K51

基于OEA框架客户化设计(一) 总体设计

各客户版本,分别把他自己配置类和主配置类结合,然后以配置文件方式注入到整个应用程序。 当应用程序读取某个配置项时,直接从注入配置类获取;此时,按照一定寻找顺序,定位该配置项。...所以应用程序定义类需要被直接DI进来,这样,客户版本信息就可以在这些DLL加载之前被访问到,也就可以继续加载这些DLL了。 内容文件组织不同于代码,这些文件很可能在运行时也需要被替换。...各客户有自己文件夹,客户A有文件夹/Files/A/。文件夹名在配置类中标明。 程序,可以文件寻找引擎指定要使用文件相对路径,使用LOGO,则指定/Images/Logo.jpg。.../// /// 获取所有此版本需要加载实体类Dll集合。..._pathProvider.MapAllPathes("Library", true); } /// /// 获取所有此版本需要加载模块Dll集合。

1.8K80

JNI设计实践之路

本文将围绕求圆面积逐步展开,探讨java程序如何调用现有的DLL?如何在C++程序创建,检查及更新Java对象?如何在C++和Java程序互抛异常,并进行异常处理?...调用Java和非Java程序所编写方法(函数),以及win32 API等. 3. 捕获和抛出“异常” 4. 装载类并获取信息 5....利用C和C++实现本地化方法(可调用非Java程序),并编译、链接生成DLL文件 4.)...头文件也定义了常量:JNI_FALSE=0 和JNI_TRUE=1;表二和表三说明了Java类型和C类型之间映射关系。...其中程序片断jstr=env->NewStringUTF(str);是C++写法,不必使用env指针。因为JNIEnv函数C++版本包含有直接插入成员函数,他们负责查找函数指针。

81230

java 调用win32 api 学习总结

更多信息 可用于从 Microsoft 下载中心下载下列文件: Jwindow.exe 有关如何下载 Microsoft 支持文件请单击下列文章编号以查看 Microsoft 知识库相应...你Java代码需要用到某种算法,不过算法是用C实现并封装在动态链接库文件DLL)当中。 对于上述三种情况,如果没有JNI的话,那就会变得异常棘手了。...2) 编译你Java类。 3) 用javah生成编译好class文件对应C/C++ 函数文件。 4) 实现头文件函数原型,编写native代码。...加载dll文件 JNative可使用两种方式加载dll文件: a.使用System.loadLibrary加载,使用此方法可加载系统目录dll文件。...本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。发现本站有涉嫌侵权/违法违规内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

2K30

【操作系统】动态链接库

动态链接库 DLL就是整个windows操作系统基础。动态链接库不能直接运行,也不能接收消息。他们就是一些独立文件。 Windows API所有函数都包含在DLL。...其中三个最重要DLL Kernel32.dll——它包含用于管理内存、进程和线程各个函数:CreateThread User32.dll——它包含用于指定用户界面任务(窗口创建和消息传送)各个函数...在编译链接可执行文件时,只需要链接引入库,DLL函数代码和数据并不复制到可执行文件,而是在运行时候,再去加载DLL,访问DLL中导出函数。...使用动态链接库好处: 增强产品功能(更换界面的DLL) 提供二次开发平台(SDK基础版本) 简化项目管理(串行开发,以多个DLL方式获取) 可以节省磁盘空间和内存 有助于资源共享(对话框模块,...在.exe文件运行时候,系统将为exe分配一个4GB地址空间,然后加载模块会分析该应用程序输入信息,从中找到该程序将要访问动态链接库信息。然后在用户机器上搜索这些动态链接库。

76320

从本质到实现,谈谈什么是 C 和 C ++ 标准库?

源 / 开源中国 简要介绍编写C/C ++应用程序领域,标准库作用以及它是如何在各种操作系统实现。...C++标准库是一组C++模板类,它提供了通用编程数据结构和函数,链表、堆、数组、算法、迭代器和任何其他你可以想到C++组件。...从Windows 95开始,Microsoft开始将其迁移到MSVCRT [版本号] .DLL(MSVCR20.DLL,MSVCR70.DLL等)之上,据推测也包含C++标准库。...在1997年左近,他们决定将文件名简化为MSVCRT.DLL,这不幸导致了令人讨厌DLL混乱。这就是为什么从Visual Studio 7.0版开始,他们切换回每个版本使用单独DLL了。...Apache版本库注重是可移植性。 如果我们脱离了标准库怎么办? 不使用标准库很简单:只要在你程序不引入它们任何一个头文件,你工作就完成了。

1.1K70

C# 通过 probing 指定 dll 寻找文件

在很大项目开发,会发现项目引用 dll 会很多,我想要按照不同功能,将不同 dll 放在不同文件夹 简单方法是通过修改 App.config 文件指定文件夹,文件移动到 abc\12 文件夹里面...asm.v1"> 创建一个简单项目...,此时项目引用一个dll doubi.dll 这个项目运行时候输出文件有 lindexi.exe 和 doubi.dll 文件 这时需要将 doubi.dll 移动到文件夹 abc\12 里面...lindexi.exe abc\12\doubi.dll 打开 App.config 添加上面的代码就可以 如果有两个不同dll需要放在两个不同文件夹, walter.dll 需要放在 walter...xx.exe.config 可以通过修改这个文件在编译之后修改 dll 寻找文件夹 如果是对于 C++ dll 需要做特殊引用,如需要区分 x86 和 x64 请看 C# 如何在项目引用x86

72910
领券