Как получить имя исполняемого файла приложения в WindowsC ++ / CLI?

StackOverflow https://stackoverflow.com/questions/124886

  •  02-07-2019
  •  | 
  •  

Вопрос

Мне нужно изменить функциональность приложения на основе имени исполняемого файла.Ничего особенного, просто меняю отображаемые строки и некоторые внутренние идентификаторы.Приложение написано на смеси нативного кода и .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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top