C语言如何获取进程自身所在目录(不是工作目录)

假设条件

假设我有如下文件

C:\folder\file.dat

我的代码

#include 
int main(void)
{
    FILE *f = fopen("file.dat", "rb");
    if (f == NULL)
    {
        puts("ERROR: Cannot open the file");
        return -1;
    }
    puts("File reader is OK");
    return 0;
}

遇到的问题

我将上面的代码编译成这个程序:

C:\folder\filereader.exe

fopen() 函数是以进程的工作目录为相对路径进行文件的读写,而不是进程自身的目录。

  • 若我在终端中将工作目录设置为 "C:\folder" ,运行filereader,可以成功访问该文件,并打印"File reader is OK"。
  • 若我换一个工作目录(比如 "C:\folder2"),运行..\folder\filereader后,fopen() 函数无法访问该文件,并打印"ERROR: Cannot open the file",因为程序试图从 "C:\folder2" 目录下搜索 "file.dat",但是搜索不到。

期望的运行结果

无论我从哪里启动这个程序,都可以以程序自身所在的目录作为相对路径访问到文件。

寻求帮助

我在做跨平台开发,所以不希望调用Windows API,尽量使用C标准库或者一些开源的库来实现此功能。
大家可能会想到 getcwd() 函数,但是它获取的是工作目录,而不是进程自身的目录。

call api

DWORD WINAPI GetModuleFileName(
    _In_opt_  HMODULE hModule,
    _Out_     LPTSTR lpFilename,
    _In_      DWORD nSize
);