Это задокументированное поведение.
За 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);