20

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

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

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

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

4

7 回答 7

39

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

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

于 2008-09-24T01:31:38.227 回答
14

费鲁乔的回答很好。这是一些示例代码:

TCHAR exepath[MAX_PATH+1];

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

MessageBox(exepath, _T("My executable name"));
于 2008-09-24T02:27:31.977 回答
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;
}

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

于 2008-09-24T01:33:12.217 回答
4

使用 __argv[0]

于 2008-09-24T06:54:51.320 回答
3

Assembly 上有一个静态方法,可以在 .NET 中为您获取它。

Assembly.GetEntryAssembly().FullName

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

Assembly.GetEntryAssembly().CodeBase

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

于 2008-09-24T01:45:27.617 回答
0

我可以确认它在 win64/visual studio 2017/MFC 下工作

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

exe 包含 exe 的完整路径。

于 2018-09-21T14:25:32.197 回答
0

根据MSDN

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

于 2020-06-05T09:56:38.767 回答