如何在WindowsC ++ / CLI中获取应用程序可执行文件的名称?
时间:2020-03-06 14:38:15 来源:igfitidea点击:
我需要根据可执行文件名称更改应用程序的功能。没什么大不了的,只是更改显示的字符串和一些内部标识符。该应用程序是使用本机代码和.Net C ++-CLI代码混合编写的。
我研究过的两种方法是解析Win32中的GetCommandLine()函数,以及在.Net中填充AppDomain和其他内容。但是,使用GetCommandLine并不总是可行,因为从调试器运行时命令行为空。 .Net AppDomain内容似乎需要很多内容。
那么,在C ++ / CLI中确定可执行文件名称的最好/最简单/最有效的方法是什么? (我希望我只是错过了.Net中可用的简单内容。)
编辑:我要提到的一件事是,这是一个使用C ++ / CLI的Windows GUI应用程序,因此无法访问传统的C样式主函数,它使用Windows WinMain()函数。
解决方案
使用0作为模块句柄来调用GetModuleFileName()。
注意:我们也可以使用argv [0]参数设置main或者在没有main的情况下调用GetCommandLine()。但是,请记住,这些方法不一定会为我们提供可执行文件的完整路径。他们将返回用于启动程序的相同字符串。调用GetModuleFileName()将始终为我们提供完整的路径和文件名。
使用argv
参数到main
:
int main(int argc, char* argv[]) { printf("%s\n", argv[0]); //argv[0] will contain the name of the app. return 0; }
我们可能需要扫描字符串以删除目录信息和/或者扩展名,但是名称在那里。
程序集上有一个静态方法,可以在.NET中为我们获取它。
Assembly.GetEntryAssembly().FullName
编辑:我没有意识到我们想要的文件名...我们也可以通过调用获得该文件名:
Assembly.GetEntryAssembly().CodeBase
这将为我们提供程序集的完整路径(包括文件名)。
Ferruccio的答案很好。这是一些示例代码:
TCHAR exepath[MAX_PATH+1]; if(0 == GetModuleFileName(0, exepath, MAX_PATH+1)) MessageBox(_T("Error!")); MessageBox(exepath, _T("My executable name"));
使用__argv [0]