如何在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]