У меня вопрос относительно симптома неправильного использования CreateProcess. Я использую параметр lpcommandline, чтобы указать путь к моему исполняемому файлу и параметрам. Мое неправильное использование заключается в том, что я не заключил путь к exe кавычками.
У меня вопрос: почему CreateProcess отлично работает на большинстве компьютеров, а не на других? Я знаю, что в большинстве случаев на пути будет свободное место, но на 90% машин с XP он работает. Я, конечно, обнаружил свою проблему в тех 10%, где этого не произошло. Но мне интересно, чем отличается на машинах, где не работает? Есть ли параметр или политика, о которых знает кто-либо из вас. И да, я собираюсь исправить проблему с цитатой. Просто любопытно, почему что-то подобное не рухнуло с места в карьер.
Таким образом, код будет выглядеть примерно так, как показано ниже, а параметр szCommandLine будет примерно таким, как показано ниже. Обратите внимание, что путь к exe-файлу не заключен в кавычки.
"C: \ Program Files \ My Company \ doit.exe параметр1 параметр2"
CreateProcess(
NULL,
szCommandLine,
NULL,
NULL,
FALSE,
NULL,
NULL,
NULL,
&si,
&pi )





Вам следует прочитать эту страницу:
http://msdn.microsoft.com/en-us/library/ms682425.aspx
И снова код стоит миллиона слов:
Это выглядит так:
char commandline[] = "C:\Program Files\My Company\doit.exe parameter1 parameter2";
CreateProcess(NULL,commandline, .... );
Или вы где-то генерируете путь к имени?
Помните, что на общие вопросы вы получите только общие ответы.
Вы должны быть конкретными, прежде чем получите конкретный ответ о том, почему в противном случае существует слишком много предположений.
Как вы сгенерировали имя exe. Вы уверены, что это «полный путь», или полагаетесь на относительный путь.
Хороший способ диагностировать что-то подобное - встроить в ваше приложение механизм сообщений об ошибках и сообщениях. Это помогает для очень многих целей - в основном для ошибок, которые вы, возможно, никогда не заметите сами, и о которых некоторые пользователи могут просто игнорировать и не сообщать вам. Таким образом вы можете диагностировать, какими были эти параметры, когда команда была вызвана и произошел сбой.
Кроме того, вы можете попробовать продолжить изучение сайта MSDN и дополнительных функций, связанных с этим методом. Вы оставили большинство из них NULL. Изучив эти расширенные функции, вы узнаете и, возможно, сможете выяснить сами, почему может быть такое несоответствие.
Еще один общий ответ, но я надеюсь, что он поможет вам оценить вашу конкретную ситуацию.
Как указано в документе, на который ссылается Мартин Йорк, CreateProcess () имеет некоторое поведение для обратной совместимости с программами с предварительными длинными именами.
"c: \ program files \ sub dir \ program name arg1 arg2" будет искать:
"c:\program.exe" files\sub dir\program name arg1 arg2 "c:\program files\sub.exe" dir\program name arg1 arg2 "c:\program files\sub dir\program.exe" name arg1 arg2 "c:\program files\sub dir\program name.exe" arg1 arg2
Поэтому, если какой-либо из этих файлов существует, Windows будет называть их, а не ваша программа. Кроме того, я бы предположил, что если бы у вас не было доступа на чтение к какой-либо из папок, в которых находятся эти возможные совпадения, CreateProcess () может немедленно выйти из строя, вместо проверки, прочитали ли вы более поздние возможные совпадения. (Windows по умолчанию проверяет доступ для чтения только к последней папке.)
Я долго боролся с той же проблемой. Итак, даже если этот вопрос был поднят давно, просто для записи, вот в чем проблема в моем случае:
Если командная строка не заключена в кавычки и содержит пробелы, CreateProcess попытается разрешить двусмысленность, как описано в ответе Саймона. Если какая-либо из протестированных частей до символа пробела также преобразуется в существующий файл без расширения или с расширением .exe, этот файл будет использоваться вместо предполагаемого полного пути.
Пример:
char cmdline[] = "C:\Program Files\App One\bin\app.exe param1 param2";
CreateProcess(NULL, cmdline, ...);
К сожалению, в моем случае на самом деле существовал файл под названием «C: \ Program Files \ App» (без расширения). CreateProcess нашел этот файл, предположил, что это исполняемый файл без расширения .exe, и попытался запустить его. Результат: ошибка 193 «% 1 не является допустимым приложением Win32».
Итог: используйте кавычки или, что еще лучше, первый аргумент CreateProcess, или найдите любой другой файл, который может соответствовать части неправильного пути.
Да, я это читал. Вот откуда я знаю, что напортачил с цитатами. Вопрос касался того, почему это будет работать даже без кавычек на многих машинах, а не на других. Я устранил проблему, я просто хочу знать, что вызвало странное поведение.