2016-03-14 3 views
-2

CreateProcess имеет 3 строковых аргумента: lpApplicationName, lpCommandLine, lpCurrentDirectory.WinAPI CreateProcess и цитирование аргументов

Я попытался процитировать этот аргумент и обнаружил, что иногда котировки прерывают мой код. Может кто-нибудь объяснить правила цитирования?

работает отлично:

NULL 
"\"C:\\some path\\my app.exe\" myparam1 myparam2" 
"C:\\some path" 

Не работает:

NULL 
"\"C:\\some path\\my app.exe\" myparam1 myparam2" 
"\"C:\\some path\"" 

работает отлично:

"C:\\some path\\my app.exe" 
"\"C:\\some path\\my app.exe\" myparam1 myparam2" 
"C:\\some path" 

Не работает:

"\"C:\\some path\\my app.exe\"" 
"\"C:\\some path\\my app.exe\" myparam1 myparam2" 
"C:\\some path" 

P.S. Извините, форматирование StackOverflow не показало мои обратные косые черты в приведенных выше примерах, и я пропустил его ... Теперь исправлено

+3

Помните, что * все * обратные косые черты в строке C должны быть экранированы; все ваши строки C должны использовать две обратные косые черты как разделитель путей. Правила цитирования аргументов описаны в документации для функции 'CommandLineToArgvW()' и в разных местах в блоге The Old New Thing. – andlabs

+2

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

+0

@RaymondChen Но если вы посмотрите на документы для CreateProcess, вы увидите, что lpApplicationName должно быть указано. Сломанные документы? –

ответ

2

Цитаты принадлежат только в lpCommandLine аргумента. Оба lpApplicationName и lpCurrentDirectory определяют имена файлов и поэтому не должны содержать встроенные кавычки.

0

Прежде всего, как уже подчеркивалось andlabs, в C любая обратная косая черта должна быть экранирована обратным слэшем.
Сказал, что правила, используемые MS для интерпретации аргументов командной строки, несколько сложны и сложны.
Объясняются здесь: https://msdn.microsoft.com/en-us/library/a1y7w461.aspx.
Я даже не пытаюсь добавить дополнительные слова ...

+0

Спасибо за советы. Но цитата из командной строки работает нормально. Что не работает - цитирование lpApplicationName и lpCurrentDirectory –

+0

В этом случае допустимы общие правила для экранирования строки C. –

+0

Из-за выхода из других параметров –

Смежные вопросы