2010-07-30 2 views
1

Меня смущают первые 2 params, module и command-line. Я нахожу, если я не заселяю и то, и другое не работает правильно, и, похоже, в документации говорится об обратном.Путаница над Win32 CreateProcess

Я хочу назвать «testApp.exe param1 = 123»

Единственный способ я нашел, что работает это:

CreateProcess("testApp.exe","testApp.exe param1=123",... 

Я думал, что любой из них должен работать, но не везло до сих пор:

CreateProcess("testApp.exe","param1=123",... 
CreateProcess(NULL,"testApp.exe param1=123",... 

Я читал документы msdn несколько раз, так что мне не хватает?

+0

Это ваш * точный * код с точной командной строкой? (BTW, обратите внимание, что командная строка не может быть строковым литералом, аргумент должен быть строкой, отличной от 'const'.) – jamesdlin

+0

'Версия Unicode этой функции CreateProcessW может изменять содержимое этой строки. Поэтому этот параметр не может быть указателем на постоянную память (например, константную переменную или литеральную строку). Если этот параметр является константой, функция может вызвать нарушение прав доступа. ' –

+0

Является ли ваша точка зрения, что вы считаете себя в безопасности, потому что вы не используете версию Unicode? Это еще не значит, что это хорошая идея. (Это подразумевалось как общий совет, а не как ответ на ваш вопрос.) – jamesdlin

ответ

2

Первый параметр - это имя исполняемого файла для запуска. Второй параметр - это командная строка. Командная строка не должна содержать имя исполняемого файла, если он не менее, и вы что-то передать, как

"param1 param2" 

то в вашей программе, argv[0] == "param1" и argv[1] == "param2". Поэтому обычно вам необходимо передать имя исполняемого файла в качестве первого значения для удовлетворения требований программы, а не Windows.

Если вы не передадите исполняемое имя, оно извлекается из первого значения в строке командной строки.

+0

Вызываемый процесс - это приложение C#, с 'static int Main (string [] args)', где исполняемое имя не включено. Это проблема? –

+0

@John, командная строка всегда передается процессу как одна строка (именно строка, которую вы передаете в качестве второго параметра в CreateProcess), до ее выполнения выполняется синтаксический анализ процесса. Независимо от того, игнорирует ли C# первый токен в этой строке, это не имеет значения. – avakar

0

Вместо того чтобы указывать имя исполняемого файла, попробуйте указать полный путь с именем исполняемого файла.

1

Я обсуждаю проблемы с получением CreateProcess для запуска exes в статье here. Есть несколько вещей, которые могут пойти не так, включая требование для полностью квалифицированных путей и отсутствующих имен exe в командной строке.

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