CreateProcess - lpApplicationName против lpCommandLine - PullRequest
1 голос
/ 18 апреля 2011

Я использовал WinPro API CreateProcess, и мне было интересно, в чем разница между использованием lpApplicationName и lpCommandLine для аргументов v.s. просто параметр lpCommandLine.

Например:

CreateProcess(NULL, L"C:\Path\To\Notepad.exe", L"C:\Path\To\File\To\Load.txt"... etc
CreateProcess(NULL, NULL, L"C:\Path\To\Notepad.exe C:\Path\To\File\To\Load.txt"... etc

Я предполагаю, что второй вариант, в котором используется только lpCommandLine, был бы похож на открытие cmd.exe и запуск этой точной строки. Но как насчет первой строки, она загружает приложение и задает аргументы командной строки по-другому?

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

Обратите внимание, я знаю, что две строки сэмплов могут не работать, так как lpCommandLine требует LPTSTR, а не LPCTSTR. Это просто для простоты понимания.

Большое спасибо за любую помощь!

Andy

Ответы [ 3 ]

4 голосов
/ 18 апреля 2011

Рекомендуется использовать оба параметра.Если вы не укажете lpApplicationName, вы дадите Windows разобрать lpCommandLine, чтобы выяснить имя приложения.Поскольку пробел является допустимым символом в именах файлов и каталогов, это может (в редких случаях) приводить к запуску неправильного приложения.(например, если у вас есть c: \ program.exe и вы запускаете программу в папке c: \ program files в Windows XP).

В обоих случаях вам следует использовать имя приложения в lpCommandLine, поскольку оно используется для вычисленияARGV [0].

3 голосов
/ 19 апреля 2011

Я никогда не использую lpApplicationName и всегда цитирую часть приложения lpCommandLine, в вашем примере я бы выполнил "C:\Path\To\Notepad.exe" "C:\Path\To\File\To\Load.txt" (цитирование всех путей, переданных в CreateProcess - хорошая идея). Просто использование lpApplicationName может вызвать проблемы с дочерними процессами, которые обращаются к argv [ 0], поэтому я держусь от этого подальше.


<rant> Использование CreateProcess для чего-либо, кроме вас самих, может быть проблематичным, поскольку NT6 + может в любой момент решить, что выполняемая вами вещь требует прав администратора из-за совместимости приложений и / или обнаружения установщика, а затем CreateProcess просто перестает работать. Если вам не нужно использовать отладку или отрываться от флагов заданий, я бы предложил просто вызвать ShellExecute [Ex], чтобы быть на безопасной стороне ... </rant>

1 голос
/ 18 апреля 2011

Согласно MSDN , lpApplicationName является необязательным и может иметь значение NULL.В этом случае имя модуля должно быть первым токеном с пробелами в строке lpCommandLine.

Если исполняемый модуль является 16-разрядным приложением, lpApplicationName должно иметь значение NULL, а строка, на которую указывает lpCommandLine, должна указывать исполняемый модуль и его аргументы.

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