Подтвердить что ты не робот

Как получить исполняемое имя приложения в WindowsС++/CLI?

Мне нужно изменить функциональность приложения на основе исполняемого имени. Ничего огромного, просто изменяя строки, которые отображаются, и некоторые внутренние идентификаторы. Приложение написано в виде кода native и .Net С++ - CLI.

Два способа, которыми я смотрел, - это разобрать функцию GetCommandLine() в Win32 и наполнить AppDomain и другие вещи в .Net. Однако использование GetCommandLine не всегда будет работать, так как при запуске из отладчика командная строка пуста. А материал .Net AppDomain, похоже, требует много начинки.

Итак, какой самый лучший/самый простой/наиболее эффективный способ определения исполняемого имени в С++/CLI? (Я очень надеюсь, что я просто пропустил что-то простое, доступное в .Net.)

Изменить: Одна вещь, которую я должен упомянуть, это то, что это приложение с графическим интерфейсом Windows с использованием С++/CLI, поэтому нет доступа к традиционной функции традиционного стиля C, он использует функцию Windows WinMain().

4b9b3361

Ответ 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

Это даст вам полный путь к сборке (включая имя файла).