GetModuleFileNameW(NULL, buf, size) 是 Windows 下获取可执行文件绝对路径最可靠方法,返回含盘符和反斜杠的宽字符路径,需检查返回值并确保缓冲区足够;Linux 用 readlink("/proc/self/exe"),macOS 优先用 _NSGetExecutablePath。

Windows 下用 GetModuleFileNameW 获取可执行文件路径
Windows 不提供直接获取“当前工作目录下程序路径”的标准 API,argv[0] 可能是相对路径、无扩展名、甚至被篡改;真正可靠的是查加载的模块句柄。GetModuleFileNameW 传入 NULL(即主模块)能拿到完整绝对路径,且自动处理重定向和符号链接。
关键点:必须用宽字符版本(W 后缀),否则遇到中文路径会截断或乱码;返回值需检查是否为 0,失败时路径为空。
- 调用前确保
buffer至少有MAX_PATH(260)或更安全地用MAX_PATH * 2宽字符空间 - 返回路径含驱动器盘符和反斜杠(
),如L"C:\MyApp\app.exe" - 若程序被硬链接或从快捷方式启动,该函数仍返回真实磁盘路径,不是快捷方式目标
Linux/macOS 下用 /proc/self/exe 符号链接读取
Linux 和 macOS(自 10.10+)都支持通过 /proc/self/exe 这个符号链接拿到当前进程的可执行文件绝对路径。它比 argv[0] 可靠得多——即使程序被 chdir 过、argv[0] 被设为破路径,这个链接依然有效。
注意:readlink 返回的是原始路径,可能含 .. 或软链中间段,不等于“规范化”结果;而且 /proc 是 Linux 特有,macOS 对应路径是 /proc/self/path/a.out(仅部分版本支持),更稳妥的做法是用 _NSGetExecutablePath(macOS)。
立即学习“C++免费学习笔记(深入)”;
- Linux 示例:
char path[PATH_MAX]; ssize_t len = readlink("/proc/self/exe", path, sizeof(path)-1);,成功后需手动加
