Пути и CreateProcess

У меня вопрос относительно симптома неправильного использования 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 )       
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
9 899
4

Ответы 4

Вам следует прочитать эту страницу:
http://msdn.microsoft.com/en-us/library/ms682425.aspx

  • Если имя приложения ПУСТО (первый параметр) .
  • В качестве имени приложения используется первое слово в командной строке, разделенное пробелами (второй параметр).
  • Если в названии приложения есть пробел, его необходимо заключить в кавычки.

И снова код стоит миллиона слов:
Это выглядит так:

char commandline[] = "C:\Program Files\My Company\doit.exe parameter1 parameter2";
CreateProcess(NULL,commandline, .... );

Или вы где-то генерируете путь к имени?
Помните, что на общие вопросы вы получите только общие ответы. Вы должны быть конкретными, прежде чем получите конкретный ответ о том, почему в противном случае существует слишком много предположений.

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

DanG 05.11.2008 21:07

Как вы сгенерировали имя exe. Вы уверены, что это «полный путь», или полагаетесь на относительный путь.

Martin York 05.11.2008 21:16

Хороший способ диагностировать что-то подобное - встроить в ваше приложение механизм сообщений об ошибках и сообщениях. Это помогает для очень многих целей - в основном для ошибок, которые вы, возможно, никогда не заметите сами, и о которых некоторые пользователи могут просто игнорировать и не сообщать вам. Таким образом вы можете диагностировать, какими были эти параметры, когда команда была вызвана и произошел сбой.

Кроме того, вы можете попробовать продолжить изучение сайта 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, или найдите любой другой файл, который может соответствовать части неправильного пути.

Другие вопросы по теме