如何在WindowsC ++ / CLI中获取应用程序可执行文件名?

时间:2008-09-24 01:29:02

标签: .net winapi c++-cli

我需要根据可执行文件名更改应用程序的功能。没什么大不了的,只是更改显示的字符串和一些内部标识符。该应用程序是由本机和.Net C ++ - CLI代码混合编写的。

我所看到的两种方法是在Win32中解析GetCommandLine()函数,并在.Net中填充AppDomain和其他东西。但是,使用GetCommandLine并不总是有效,因为从调试器运行时命令行为空。而.Net AppDomain的东西似乎需要很多东西。

那么在C ++ / CLI中确定可执行文件名称的最好/最简单/最有效的方法是什么? (我有点希望我错过了.Net中可用的简单内容。)

编辑:我应该提到的一件事是,这是一个使用C ++ / CLI的Windows GUI应用程序,因此无法访问传统的C风格主函数,它使用Windows WinMain()函数。

7 个答案:

答案 0 :(得分:35)

使用0作为模块句柄调用GetModuleFileName()

注意:如果没有main,你可以使用argv [0]参数来主或调用GetCommandLine()。但是,请记住,这些方法不一定会为您提供可执行文件的完整路径。它们将返回用于启动程序的相同字符串。调用GetModuleFileName()将始终为您提供完整的路径&文件名。

答案 1 :(得分:10)

Ferruccio的回答很好。这是一些示例代码:

TCHAR exepath[MAX_PATH+1];

if(0 == GetModuleFileName(0, exepath, MAX_PATH+1))
    MessageBox(_T("Error!"));

MessageBox(exepath, _T("My executable name"));

答案 2 :(得分:8)

argv参数用于main

int main(int argc, char* argv[])
{
    printf("%s\n", argv[0]);  //argv[0] will contain the name of the app.
    return 0;
}

您可能需要扫描字符串以删除目录信息和/或扩展名,但名称将在那里。

答案 3 :(得分:4)

使用__argv [0]

答案 4 :(得分:3)

在程序集上有一个静态方法可以在.NET中为您提供。

Assembly.GetEntryAssembly().FullName

编辑:我没有意识到你想要文件名......你也可以通过调用:

来实现
Assembly.GetEntryAssembly().CodeBase

这将为您提供程序集的完整路径(包括文件名)。

答案 5 :(得分:0)

我可以确认它可以在Win64 / Visual Studio 2017 / MFC下正常工作

TCHAR szFileName[MAX_PATH + 1];
GetModuleFileName(NULL, szFileName, MAX_PATH + 1);
auto exe = CString(szFileName);

exe包含exe的完整路径。

答案 6 :(得分:0)

根据MSDN

全局变量_pgmptr自动初始化为完整变量 可执行文件的路径,可用于检索完整路径 可执行文件的名称。