5

可能重复:
提取当前可执行文件名

我创建了一个从 ini 文件读取配置的程序,该文件的名称应该与可执行文件的名称相同,但当然还有它的扩展名。因此,如果我将其命名myprogram.exe为 config myprogram.ini,并且如果我在编译后更改 exe 的名称,它应该看起来与它的新名称一致。

我知道可以从中获取程序名称,argv[0]但这仅在它从命令行开始时才有效,当在资源管理器中单击它时,该数组为空。

当我在这里阅读答案时,我认为它必须与此功能有关:https ://stackoverflow.com/a/10572632/393087 - 但我找不到任何使用该功能的好例子,我C++ 的初学者和一般函数定义(如 microsoft 页面上提供的定义)对我来说太难理解了,但是当我得到一个工作示例时,我很容易理解。

4

2 回答 2

11
#include <windows.h>
#include <Shlwapi.h>
// remember to link against shlwapi.lib
// in VC++ this can be done with
#pragma comment(lib, "Shlwapi.lib")

// ...

TCHAR buffer[MAX_PATH]={0};
TCHAR * out;
DWORD bufSize=sizeof(buffer)/sizeof(*buffer);
// Get the fully-qualified path of the executable
if(GetModuleFileName(NULL, buffer, bufSize)==bufSize)
{
    // the buffer is too small, handle the error somehow
}
// now buffer = "c:\whatever\yourexecutable.exe"

// Go to the beginning of the file name
out = PathFindFileName(buffer);
// now out = "yourexecutable.exe"

// Set the dot before the extension to 0 (terminate the string there)
*(PathFindExtension(out)) = 0;
// now out = "yourexecutable"

现在,您有一个指向可执行文件“基本名称”的指针;请记住,它指向 inside buffer,因此buffer超出范围时out不再有效。

于 2012-05-30T11:09:33.783 回答
4

GetModuleFileName(NULL, .....)

但我找不到任何使用该功能的好例子

你还不够努力。msdn 上“GetModuleFileName”文章 中的“示例”部分

于 2012-05-30T11:04:21.110 回答