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

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

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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
20
0
31 994
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Ответ принят как подходящий

Вызовите GetModuleFileName (), используя 0 в качестве дескриптора модуля.

Примечание: вы может также используете параметр argv[0] для основного или вызываете GetCommandLine(), если основного нет. Однако имейте в виду, что эти методы не обязательно дадут вам полный путь к исполняемому файлу. Они вернут ту же строку символов, которая использовалась для запуска программы. Вместо этого вызов GetModuleFileName() всегда даст вам полный путь и имя файла.

Используйте аргумент argv для main:

int main(int argc, char* argv[])
{
    printf("%s\n", argv[0]);  //argv[0] will contain the name of the app.
    return 0;
}

Возможно, вам потребуется просканировать строку, чтобы удалить информацию о каталоге и / или расширения, но имя будет там.

Это решение имеет дополнительное преимущество в том, что оно кроссплатформенное.

Adam Pierce 24.09.2008 05:49

Да, это так, хотя я не ищу кроссплатформенный, а только для Windows с использованием Win32 или .Net.

Daemin 24.09.2008 06:08

-1, в некоторых случаях не работает. Например, введите только имя инструмента (игнорируйте расширение .exe) в командной строке.

Kane 02.03.2011 06:58

В сборке есть статический метод, который получит его в .NET.

Assembly.GetEntryAssembly().FullName

Обновлено: я не понимал, что вам нужно имя файла ... вы также можете получить это, позвонив:

Assembly.GetEntryAssembly().CodeBase

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

Хотя изначально это казалось правильным вариантом, на практике он не работает, поскольку имя сборки остается неизменным независимо от того, какое имя исполняемого файла присвоено.

Daemin 24.09.2008 07:43

Ферруччо ответил хорошо. Вот пример кода:

TCHAR exepath[MAX_PATH+1];

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

MessageBox(exepath, _T("My executable name"));

Из msdn: If the function fails, the return value is 0 (zero), так что да ... вы можете использовать == вместо != в своем условном выражении

Ivan Nikolchov 07.01.2012 02:24

Используйте __argv [0]

Самый простой и лучший ответ.

user1180790 13.10.2014 00:14

Только если программа запускалась с main или WinMain, а не wmain, wWinMain. Если "w" main является точкой входа, то должен использоваться __wargv. Другой "argv" останется нулевым.

Ajay 30.08.2017 15:12

Я могу подтвердить, что он работает под win64 / visual studio 2017 / MFC

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

exe содержит полный путь к exe.

Согласно MSDN:

The global variable _pgmptr is automatically initialized to the full path of the executable file, and can be used to retrieve the full path name of an executable file.

Другие вопросы по теме