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

C++编程实现获取当前可执行文件名称

、介绍

在C++开发中,有时需要获取当前可执行文件的名称用来处理一些事务。那么,在主流的平台上,获取当前可执行文件名称的方法有哪些呢?一般来说,无论哪个平台下都分为以下几类:

  • 使用接口
  • 使用配置文件或相关属性(注册表等)
  • 使用第三方库

下面将分别在Windows和Linux两大主流平台上进行分析说明。

二、Windows平台

按照上面的三类划分,在Windows平台上获取可执行文件名称的方法有:

1.系统接口

1)使用GetModuleFileName函数,这是在Windows平台上推荐的用法:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

#include <windows.h>

#include <iostream>

#include <string>

intmain() {

charexePath[MAX_PATH];

DWORDlen = GetModuleFileNameA(NULL, exePath, MAX_PATH);

if(len == 0) {

std::cerr <<"err code: "<< GetLastError() << std::endl;

return1;

}

std::string fullPath(exePath);

std::cout <<"cur full path: "<< fullPath << std::endl;

return0;

}

2)使用C提供的_get_pgmptr函数来获取_pgmptr

1

2

3

4

5

6

7

8

9

10

#include <cstdlib>

#include <iostream>

intmain() {

char* pgmptr = nullptr;

errno_t err = _get_pgmptr(&pgmptr);

if(pgmptr != nullptr) {

std::cout <<"full path: "<< pgmptr << std::endl;

}

return0;

}

2.配置文件及相关

  • 直接读取main函数中的argv[0],它一般只包括名字而不包括完整路径。这个简单就不举例了。
  • 读取环境变量或配置文件(这需要程序中做一些特殊的输出或配置,普通的可执行文件可能无法应用)

3.第三方库

在Windows平台上有很多的第三方框架或库都提供了类似的机制,如boost::dll::program_location()等。例程看后面。

三、Linux平台

Linux平台亦是如此,但是它的实现方式更加丰富:

1.系统接口

使用dladdr

1

2

3

4

5

6

7

8

9

10

#include <iostream>

#include <dlfcn.h>

intmain() {

Dl_info dl;

if(dladdr((void*)main, &dl) && dl.dli_fname) {

std::cout <<"path: "<< dl.dli_fname << std::endl;

}

return0;

}

其它平台一些变种:如Solaris中的getexecname()接口等

2.配置文件及相关

读取/proc/self/exe链接,获取当前可执行文件名称

1

2

3

4

5

6

7

8

9

10

11

12

13

#include <iostream>

#include <unistd.h>

#include <limits.h>

intmain() {

charexePath[PATH_MAX];

ssize_t len = readlink("/proc/self/exe", exePath,sizeof(exePath) - 1);

if(len != -1) {

exePath[len] ='\0';

std::cout <<"full path: "<< exePath << std::endl;

}

return0;

}

读取/proc/self/cmdline

1

2

3

4

5

6

7

8

9

10

11

12

13

#include <iostream>

#include <fstream>

#include <string>

intmain() {

std::ifstream cmdline("/proc/self/cmdline");

if(cmdline.is_open()) {

std::string exePath;

std::getline(cmdline, exePath,'\0');

std::cout <<"full path: "<< exePath << std::endl;

}

return0;

}

使用main函数中的argv[0],不赘述

gunlib中的program_name

这个需要主动初始化,有点类似Windows平台的特殊配置

3.第三库

1)典型的就是使用Boost库中的boost::dll::program_location(),看例子:

1

2

3

4

5

6

7

8

#include <iostream>

#include <boost/dll/runtime_symbol_info.hpp>

intmain() {

boost::dll::fs::path fullPath = boost::dll::program_location();

std::cout <<"full path: "<< fullPath.string() << std::endl;

return0;

}

2)其它一些特定系统上的库如libbsd等

四、分析说明

除了上面的分析的方法外,另外还可以使用一些特殊的技巧来获取执行文件的名称,比如使用调试的接口(backstarce函数)等等。

通过上面的分析说明,基本上可以看到它们的优缺点。

对使用接口操作来说,优点是安全稳定及准确,但可能无法跨平台。而且可能有的平台上需要安装一些特定的库;

一般来说,使用配置及相关的方法,相对来说都比较准确,通常包括完整的全路径。但缺点是依赖于特定的平台或系统,而且有可能还需要权限。这点就限制了不少的应用,特别是在某些裁剪的系统上的应用;

使用第三方库的优点是应用上简单,灵活多变。缺点是需要安装第三方库而且在编译时需要增加对相关的库的链接。对于一些小的工程就不太实用了。

这里必须单独把使用argv[0]拿出来,它作为一种很传统的获取可执行文件名称的方法,在正式场景下不建议使用。因为影响它的因素比较多,有可能名称根本就不对。所以还是要引起注意。

五、总结

其实在真正的应用中,这种小功能的需求层出不穷。真正和用户打过交道的开发者就会明白,用户有时候想得非常“野”,让开发者有一种应接不暇的感觉。其实换位思考,谁都想让软件的应用更方便快捷。一个小功能往往就会让用户感到软件的人性化。

http://www.jsqmd.com/news/1336692/

相关文章:

  • 股东变化趋势数据挖掘:用Python追踪筹码集中度与主力动向
  • VLA:驱动具身智能迈向通用的关键引擎
  • eNSP网络仿真入门:从IP配置到故障排查的完整实战指南
  • Docker容器技术原理
  • 用 LVGL 给 UEFI Setup 换一套图形界面:架构、实现与 QEMU 验证
  • BilibiliDown 终极指南:如何快速下载B站视频的完整教程
  • 【重磅】NVIDIA CMP 170HX 矿卡解锁:8GB→64GB、算力接近「真 A100」完整教程(含验证)
  • 三极管工作原理与共射极放大电路设计:从非线性特性到稳定偏置
  • KKCE: 基于 ETag 指纹碰撞与条件请求的网站测速缓存一致性审计-快快测
  • Python工作流引擎SpiffWorkflow完全指南:从入门到精通掌握BPMN流程自动化
  • 北京靠谱的旅游包车机构哪家强?本地老司机推荐 - 品牌优推
  • 电力系统碳排放优化调度模型设计与实践
  • CAD三维建模零基础入门:从软件选择到核心建模流程全解析
  • Java逻辑运算符深度解析:从短路求值到优先级陷阱与实战避坑
  • QTableWidget 实战:自动换行且行高自适应的完整方案
  • 学术研究者的高效翻译助手:Zotero PDF2zh插件完全指南
  • AUTOSAR架构如何实现汽车嵌入式软件代码复用:从分层设计到工程实践
  • 3步搞定微信公众号数据采集:Python爬虫实战指南
  • FastLED电源管理实战指南:高效控制LED电流的7大关键策略
  • 深度学习在智能交通系统中的应用与实践
  • 机动目标跟踪:Singer与当前统计模型原理及MATLAB仿真实践
  • 2026年广州潮汕肠粉加盟企业怎么选择?看实利更重要 - 品牌优推
  • 国内开发者合规访问主流AI大模型(Gemini/ChatGPT/Claude/Grok)实战指南
  • 3分钟学会AI全自动短视频制作:Pixelle-Video让你轻松成为内容创作者
  • 从原子钟到厘米级定位:GPS时间系统与高精度定位技术全解析
  • codex必用10大视频skill,从0到1做爆款
  • 链上套利残酷共学-DAY01
  • 臃肿工具箱里的“无用之重”
  • KKCE: 基于 BGP 路由收敛与 AS Path 预热的网站测速冷启动优化-快快测
  • 从手写 Hash 路由到 React Router:一个路由练习的关键实现