Преобразование argv обратно в одну строку - PullRequest
5 голосов
/ 10 июня 2009

Я пишу (Win32 Console) программу, которая оборачивает другой процесс; он принимает параметры как в следующем примере:

runas.exe user notepad foo.txt

То есть: runas анализирует user и затем запустит блокнот, передав остальные параметры.

Моя проблема в том, что argv разбит на отдельные параметры, но CreateProcessAsUser требует один lpszCommandLine параметр.

Построение этой командной строки, вероятно, не так просто, как простое объединение argv вместе с пробелами. Есть указатели?

Это всего лишь пример. Мой первый аргумент на самом деле не имя пользователя, и в нем могут быть пробелы. Это делает ручной анализ результата GetCommandLine хитрым.

Аналогично, наивная конкатенация argv не будет работать, потому что она должна иметь дело со случаем, когда исходные аргументы были заключены в кавычки, и в них могут быть пробелы.

Ответы [ 4 ]

7 голосов
/ 10 июня 2009

Сложно вручную их рекомбинировать:

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

Также, если есть какие-либо параметры, в которых есть пробелы, вы можете присоединить их к строке с кавычками вокруг них. Вот пример странного экранирующего правила: если у вас есть --folderpath "c:\test\", то последний обратный слеш должен быть удвоен --folderpath "c:\test\\".

Если вы используете MFC:

Вы можете получить желаемое значение из theApp.m_lpCmdLine вашего CWinApp. Обратите внимание, что вы по-прежнему можете получить к ним доступ также с помощью __argc и __argv или CommandLineToArgvW .

Если вы используете только Win32 (даже без графического интерфейса):

Вы можете получить его из WinMain . Который может быть точкой входа вашей программы.

Обратите внимание, что вы по-прежнему можете получить к ним доступ также с помощью __argc и __argv или CommandLineToArgvW .

Если вы должны использовать консольное приложение с main или wmain:

Win32 API GetCommandLine , кажется, путь. Вы должны все еще проанализировать это, чтобы пройти мимо имени .exe. Примите во внимание кавычки вокруг имени / пути exe тоже. Если в начале таких кавычек нет, просто перейдите к следующему пробелу для начала.

2 голосов
/ 10 июня 2009

Вы можете использовать функцию GetCommandLine .

Почему бы не использовать WinMain вместо main? Это должно дать вам строку в нужном вам формате.

1 голос
/ 10 июня 2009

Существует вызов Win32 API, который возвращает командную строку: GetCommandLine

0 голосов
/ 10 июня 2009

Если у вас есть строка, выделенная достаточно места, затем используйте strcat для каждого элемента в списке. Да, это так же просто, как соединить их вместе с пробелами.

Редактировать: Конечно, вам необходимо заключить любые элементы, содержащие пробелы в кавычки.

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