getmodulefilenamea 是 windows 下获取当前可执行文件完整路径最直接可靠的方式,需传 null 句柄、提供足够缓冲区(如 max_path),返回实际长度,超长需重试,路径含反斜杠。

Windows 下用 GetModuleFileNameA 获取可执行文件完整路径
这是最直接可靠的方式,适用于绝大多数 Win32 C++ 程序。它返回当前模块(即主 EXE)的完整路径字符串,包括盘符、目录和文件名。
常见错误是传入 NULL 作为模块句柄,这在非 DLL 场景下虽能工作,但不严谨;应显式传 NULL 或 GetModuleHandleA(NULL) —— 两者等价,但前者更简洁。
- 缓冲区必须足够大,推荐用
MAX_PATH(260)或动态分配 + 调用两次(第一次获取所需长度) - 返回值为实际写入字符数,若 ≥ 缓冲区大小,说明路径被截断,需重试
- 路径含反斜杠
,如需正斜杠或进一步解析目录,得手动替换或用std::filesystem::path处理
char path[MAX_PATH] = {0};
DWORD len = GetModuleFileNameA(NULL, path, MAX_PATH);
if (len > 0 && len < MAX_PATH) {
// path 现在包含完整路径,如 "C:\app\myapp.exe"
}
Linux/macOS 下读取 /proc/self/exe 符号链接
POSIX 系统没有等价 API,但 Linux 提供 /proc/self/exe 这个符号链接,指向当前进程的可执行文件。macOS 则需用 _NSGetExecutablePath(仅限 macOS,且不保证返回绝对路径)。
注意:readlink 不会自动补全相对路径,也不处理符号链接嵌套;如果程序通过硬链接或 symlink 启动,/proc/self/exe 返回的是原始目标路径,不是启动时的路径名。
立即学习“C++免费学习笔记(深入)”;
- Linux 示例中务必检查
readlink返回值,负值表示失败(如容器中 /proc 不可用) - 缓冲区要留出终止符空间,
readlink不自动加
