我需要改变基于可执行名称的应用程序的功能。 没有巨大的,只是改变所显示的字符串和一些内部标识符。 该应用程序被写入的天然混合物和.Net C ++ - CLI代码。
我已经看了两种方法是分析在Win32中的GetCommandLine()函数和馅与周围的AppDomain中和其他的东西在.NET。 然而,使用GetCommandLine并不总是可行的从调试器的命令行是空的运行时。 和.NET的AppDomain东西好像都需要大量的馅周围。
那么,什么是最好的/简单/最有效的C ++ / CLI确定可执行文件的名称的方式? (我是一种希望,我只是错过了一些简单的可在.NET。)
编辑:有一两件事,我应该提到的是,这是一个使用C ++ / CLI在Windows GUI应用程序,因此也对传统的C风格的主要功能用不上,它使用了Windows的WinMain()函数。
调用GetModuleFileName() ,使用0作为模块句柄。
注意:您还可以使用的argv [0]参数主要或致电GetCommandLine(),如果没有为主。 但是,请记住,这些方法不一定给你的可执行文件的完整路径。 他们会给回已经用于启动该程序相同的字符的字符串。 调用GetModuleFileName()总是给你一个完整的路径和文件名。
费鲁乔的回答是好。 下面是一些示例代码:
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;
}
您可能需要扫描字符串以删除目录信息和/或扩展,但名称将在那里。
有关于大会的静态方法将得到它为你的.NET。
Assembly.GetEntryAssembly().FullName
编辑:我不知道你想要的文件名......你也可以通过调用:
Assembly.GetEntryAssembly().CodeBase
这将让你的完整路径组件(包括文件名)。
我可以证实它工作在Win64中/视频工作室2017年/ MFC
TCHAR szFileName[MAX_PATH + 1];
GetModuleFileName(NULL, szFileName, MAX_PATH + 1);
auto exe = CString(szFileName);
exe文件中包含完整路径的exe。