Как получить имя исполняемого файла приложения в WindowsC ++ / CLI?
Вопрос
Мне нужно изменить функциональность приложения на основе имени исполняемого файла.Ничего особенного, просто меняю отображаемые строки и некоторые внутренние идентификаторы.Приложение написано на смеси нативного кода и .Net C ++-CLI.
Два способа, которые я рассмотрел, - это проанализировать функцию GetCommandLine() в Win32 и использовать AppDomain и другие вещи в .Net.Однако использование GetCommandLine не всегда будет работать, так как при запуске из отладчика командная строка пуста.А материал с .Net AppDomain, похоже, требует большой доработки.
Итак, каков самый приятный / простой / эффективный способ определения имени исполняемого файла в C ++ / CLI?(Я отчасти надеюсь, что я просто пропустил что-то простое, что доступно в .Net.)
Редактировать:Одна вещь, которую я должен упомянуть, это то, что это приложение с графическим интерфейсом Windows, использующее C ++ / CLI, поэтому нет доступа к традиционной основной функции в стиле C, оно использует функцию Windows WinMain ().
Решение
Звонить GetModuleFileName() использование 0 в качестве дескриптора модуля.
Примечание:ты может также используйте параметр argv[0] для main или вызовите GetCommandLine(), если нет main .Однако имейте в виду, что эти методы не обязательно предоставят вам полный путь к исполняемому файлу.Они вернут ту же строку символов, которая использовалась для запуска программы.Вызов 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;
}
Возможно, вам потребуется отсканировать строку, чтобы удалить информацию о каталоге и / или расширениях, но имя там будет.
Используйте __argv[0]
В Assembly есть статический метод, который получит его для вас в .NET.
Assembly.GetEntryAssembly().FullName
Редактировать:Я не знал, что вам нужно имя файла...вы также можете получить это, позвонив по телефону:
Assembly.GetEntryAssembly().CodeBase
Это даст вам полный путь к сборке (включая имя файла).
Я могу подтвердить, что это работает под управлением win64 / visual Studio 2017 / MFC
TCHAR szFileName[MAX_PATH + 1];
GetModuleFileName(NULL, szFileName, MAX_PATH + 1);
auto exe = CString(szFileName);
exe содержит полный путь к exe.