Как получить исполняемое имя приложения в WindowsС++/CLI?
Мне нужно изменить функциональность приложения на основе исполняемого имени. Ничего огромного, просто изменяя строки, которые отображаются, и некоторые внутренние идентификаторы. Приложение написано в виде кода native и .Net С++ - CLI.
Два способа, которыми я смотрел, - это разобрать функцию GetCommandLine() в Win32 и наполнить AppDomain и другие вещи в .Net. Однако использование GetCommandLine не всегда будет работать, так как при запуске из отладчика командная строка пуста. А материал .Net AppDomain, похоже, требует много начинки.
Итак, какой самый лучший/самый простой/наиболее эффективный способ определения исполняемого имени в С++/CLI? (Я очень надеюсь, что я просто пропустил что-то простое, доступное в .Net.)
Изменить: Одна вещь, которую я должен упомянуть, это то, что это приложение с графическим интерфейсом Windows с использованием С++/CLI, поэтому нет доступа к традиционной функции традиционного стиля C, он использует функцию Windows WinMain().
Ответы
Ответ 1
Вызвать GetModuleFileName(), используя 0 в качестве дескриптора модуля.
Примечание: вы также можете использовать параметр argv [0] для main или вызвать GetCommandLine(), если нет основного. Однако имейте в виду, что эти методы не обязательно предоставят вам полный путь к исполняемому файлу. Они вернут ту же строку символов, которая использовалась для запуска программы. Вызов GetModuleFileName() всегда даст вам полный путь и имя файла.
Ответ 2
Ответ Ferruccio - это хорошо. Вот пример кода:
TCHAR exepath[MAX_PATH+1];
if(0 == GetModuleFileName(0, exepath, MAX_PATH+1))
MessageBox(_T("Error!"));
MessageBox(exepath, _T("My executable name"));
Ответ 3
Используйте аргумент argv
для main
:
int main(int argc, char* argv[])
{
printf("%s\n", argv[0]); //argv[0] will contain the name of the app.
return 0;
}
Вам может потребоваться отсканировать строку, чтобы удалить информацию о каталоге и/или расширениях, но имя будет там.
Ответ 4
Используйте __argv [0]
Ответ 5
В сборке есть статический метод, который вы получите в .NET.
Assembly.GetEntryAssembly().FullName
Изменить: я не понимал, что вам нужно имя файла... вы также можете получить это, вызвав:
Assembly.GetEntryAssembly().CodeBase
Это даст вам полный путь к сборке (включая имя файла).