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

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

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

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

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

Ответы [ 6 ]

35 голосов
/ 24 сентября 2008

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

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

10 голосов
/ 24 сентября 2008

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

TCHAR exepath[MAX_PATH+1];

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

MessageBox(exepath, _T("My executable name"));
8 голосов
/ 24 сентября 2008

Используйте аргумент 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 голосов
/ 24 сентября 2008

Использовать __argv [0]

3 голосов
/ 24 сентября 2008

Существует статический метод на ассемблере, который доставит его вам в .NET.

Assembly.GetEntryAssembly().FullName

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

Assembly.GetEntryAssembly().CodeBase

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

0 голосов
/ 21 сентября 2018

Я могу подтвердить, что он работает под Win64 / Visual Studio 2017 / MFC

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...