Имя процесса отсутствует в GetCommandLine () - PullRequest
2 голосов
/ 20 июля 2010

У меня проблема с GetCommandLine() API.

Обычно он возвращает имя исполняемого файла с пробелом и аргументами.Как сказано в документации, первый токен может не иметь полного пути к образу и тому подобное.

У меня никогда не было проблем до сих пор, когда я использовал CreateProcess с lpApplicationName не NULL.используйте:

CreateProcess(NULL, "\"c:\\myexe.exe\" param1 param2", ...)

GetCommandLine возвращает "c: \ myexe.exe param1 param2", как и ожидалось.

Но если я использую:

CreateProcess("C:\myexe.exe", "param1 param2")

GetCommandLine возвращает только «param1 param2».

Как узнать, что имя исполняемого файла задается в командной строке, если другое приложение запускает мое?

Кроме того, код запуска MFC предполагает, что первый токенв командной строке имя исполняемого файла и пропускает его.Но если вы запустите приложение MFC со вторым примером API CreateProcess, код MFC пропустит первый аргумент.

Ответы [ 2 ]

2 голосов
/ 01 июня 2016

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

2 голосов
/ 13 августа 2010

У меня есть обходной путь, который может помочь в таком случае, как этот. Я думаю, мы всегда сможем проверить, как был запущен наш модуль. В этом случае мы должны проверить первый аргумент.

Я напишу код, потому что у меня есть проблемы с английским языком. Здесь два пути:

Первый случай . мы можем сравнить имя модуля с первым аргументом командной строки. как то так:

const TCHAR* csCommandLine = ::GetCommandLine();

// Attention!!! the first symbol can be quete

if (*csCommandLine == _T('\"'))
    csCommandLine++;

TCHAR sModuleFileName[MAX_PATH];

DWORD dwModuleFileName = ::GetModuleFileName(NULL, sModuleFileName, MAX_PATH);

if (dwModuleFileName && !_tcsncmp(csCommandLine, sModuleFileName, dwModuleFileName)) {

    // The command line contains the module name.
}

Второй случай . мы можем попытаться получить атрибуты файла для первого аргумента командной строки как то так:

// Внимание !!! не используйте его, если вы собираетесь передавать путь к файлу в аргументах командной строки.

int nArgc;

LPTSTR* szArglist = ::CommandLineToArgvW(::GetCommandLine(), &nArgc);

if (nArgc && ::GetFileAttributes(szArglist[0]) != INVALID_FILE_ATTRIBUTES) {

    // The command line contains the module name.
}

::LocalFree(szArglist);

Надеюсь, это кому-нибудь пригодится.

С уважением, Владимир

...