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

我需要根据可执行文件名更改应用程序的function。 没有什么大的,只是改变显示的string和一些内部标识符。 该应用程序是用本地和.Net C ++ – CLI代码混合编写的。

我看过的两种方法是parsingWin32中的GetCommandLine()函数,并在.Net中填充AppDomain和其他东西。 然而,使用GetCommandLine并不总是如同从debugging器运行时那样命令行是空的。 而.Net AppDomain的东西似乎需要大量的填充。

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

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

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

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

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

TCHAR exepath[MAX_PATH+1]; if(0 == GetModuleFileName(0, exepath, MAX_PATH+1)) MessageBox(_T("Error!")); MessageBox(exepath, _T("My executable name")); 

使用argv参数来main

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

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

使用__argv [0]

有一个静态的方法汇编,将在.NET中得到它。

 Assembly.GetEntryAssembly().FullName 

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

 Assembly.GetEntryAssembly().CodeBase 

这将使您获得程序集的完整path(包括文件名)。