CommandLineToArgvW причуда - PullRequest
       1

CommandLineToArgvW причуда

0 голосов
/ 06 апреля 2019

У меня есть небольшая программа win32, которая вызывает CommandLineToArgvW с заданным lpCmdLine

int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
  (void)hInstance;
  (void)hPrevInstance;
  (void)nCmdShow;
  int argc;
  LPTSTR* argv =  CommandLineToArgvW(lpCmdLine, &argc);
  MessageBoxW(0, lpCmdLine, TEXT("lpCmdLine"), MB_OK    );

  for(int i=0; i<argc;++i){
    MessageBoxW(0, argv[i], TEXT("argv"), MB_OK );
  }
  return 0;
}

. Странная вещь, которую я наблюдаю:

  • , если я вызываюпрограмма без параметра, lpCmdLine - пустая строка и CommandLineToArgvW возвращает 1 аргумент - путь к исполняемому файлу.
  • при вызове с параметром, CommandLineToArgvW возвращает точное количество параметров без исполняемого файла

Я не смог найти это странное поведение задокументированным.

Что я пропустил?Использую ли я команду непреднамеренно?

1 Ответ

2 голосов
/ 06 апреля 2019

Это задокументированное поведение.

За CommandLineToArgvW():

lpCmdLine

Тип: LPCWSTR

Указатель на завершенную нулем строку Юникода, которая содержит полную командную строку. Если этот параметр является пустой строкой, функция возвращает путь к текущему исполняемому файлу.

Это означает, что CommandLineToArgvW() возвращает ТОЛЬКО имя вызывающего исполняемого файла, если параметр lpCmdLineимеет значение null или явно включает имя исполняемого файла.

Обратите внимание, что CommandLineToArgvW() хочет полная командная строка .Однако по WinMain():

lpCmdLine

Тип: LPSTR

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

Итак, когда вы запускаете программу без параметров, WinMainПараметр lpCmdLine пуст, а CommandLineToArgvW() возвращает только имя исполняемого файла.Но если вы выполняете программу с параметрами, параметр lpCmdLine не является пустым, но не включает имя исполняемого файла, поэтому CommandLineToArgvW() возвращает только параметры без имени исполняемого файла.

Таким образом, вам необходимоделайте то, что говорится в документации WinMain() и используйте GetCommandLine() вместо lpCmdLine.Это также указано в документации CommandLineToArgvW():

Функция GetCommandLineW может использоваться для получения строки командной строки, которая подходит для использования в качестве lpCmdLineпараметр.

Итак, используйте это вместо:

LPWSTR* argv = CommandLineToArgvW(GetCommandLineW(), &argc);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...