Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2004.05.02;
Скачать: [xml.tar.bz2];

Вниз

CreateProcess   Найти похожие ветки 

 
MichailDalakov   (2004-03-09 12:54) [0]

Почему не отрабатывает CreateProcess?

Делаю так:
ShellExecute(Handle,nil,PChar(MainPathSvDb+"\Utils\rar.exe"),PChar(" a -m5 -df "E"+DtSvDb+".rar" "+"""+DtSvDb+"""),nil,SW_NORMAL);
и все ОК!

То же самое через CreateProcess

CreateProcess(PChar(MainPathSvDb+"\Utils\rar.exe"),PChar(" a -m5 -df "E"+DtSvDb+".rar" "+"""+DtSvDb+"""),nil,nil,false,Normal_Priority_Class,nil,nil,SI,PI)
и все плохо,
хотя другие приложения через CreateProcess запускаются

GetLastError возвращает 0.


 
Reindeer Moss Eater ©   (2004-03-09 13:07) [1]

если не запускается - фактические параметры у CreateProcess неверны.


 
MichailDalakov   (2004-03-09 13:21) [2]

Какие фактические параметры ?

копирую параметры PChar(MainPathSvDb+"\Utils\rar.exe"),PChar(" a -m5 -df "E"+DtSvDb+".rar" "+"""+DtSvDb+""") в переменные и из командной строки без проблем все запускается.


 
Reindeer Moss Eater ©   (2004-03-09 13:25) [3]

Второй параметр - string that specifies the command line to execute.

Он у тебя определяет командную строку ту би екзекутед?
Если да - то я испанский летчик.


 
Reindeer Moss Eater ©   (2004-03-09 13:32) [4]

Кроме того, в твоем коде не видно предварительной подготовки параметра si


 
MichailDalakov   (2004-03-09 13:53) [5]

Второй параметр CreateProcess - набор параметров с которыми запускается приложение

Почему нет?

Например, делаю

CreateProcess(PChar("C:\oracle\ora90\bin\exp.exe"),PChar(" "+FLoginPrms+"/"+FPassWordPrms+"@ODB9i file="+DtSvDb+".dmp log="+DtSvDb+".log"),nil,nil,false,Normal_Priority_Class,nil,nil,SI,PI)

и все ОК!


 
Reindeer Moss Eater ©   (2004-03-09 13:56) [6]

Второй параметр CreateProcess - набор параметров с которыми запускается приложение

Кто это сказал? Мама?

Второй параметр - string that specifies the command line to execute.

Это командная строка которая должна быть выполнена.

Даже если ты ее рассматриваешь как список параметров, то почему передаешь только ParamsStr(1), ParamsStr(2), ParamsStr(N)?

Где ParamsStr(0)?


 
Игорь Шевченко ©   (2004-03-09 14:04) [7]

If the process to be created is an MS-DOS - based or Windows-based application, lpCommandLine should be a full command line in which the first element is the application name. Because this also works well for Win32-based applications, it is the most robust way to set lpCommandLine.


 
Michail Dalakov ©   (2004-03-09 15:16) [8]

Воспользовался Игорь Шевченко ©   (09.03.04 14:04) [7]
все OK!
Насчет мамы не понял, я просто отвечал на поставленный ранее вопрос.

Всем, спасибо.


 
Игорь Шевченко ©   (2004-03-09 15:28) [9]


> Воспользовался Игорь Шевченко ©   (09.03.04 14:04) [7]
> все OK!


Если быть точным, то это не мой совет, а help, который надо любить и читать.


 
Reindeer Moss Eater ©   (2004-03-09 15:36) [10]

Меньше часа челу потребовалось, что бы поверить в [1].
Не так уж и плохо.


 
Diamond Cat ©   (2004-03-09 15:40) [11]


> Michail Dalakov ©   (09.03.04 15:16) [8]
> Воспользовался Игорь Шевченко ©

Игорь, тебе понравилось ??????   :о)


 
Michail Dalakov ©   (2004-03-09 16:07) [12]

A кто-то сразу понял, что в [8] имелось ввиду [7],

Нет, нет, нет я больше ничего не скажу...

Молчу, молчу, молчу...


 
MichailDalakov   (2004-03-09 16:33) [13]

Если, честно, то я ни с кем не хочу беседовать на стороние темы,
мнения всех участников форума я ценю, но есть люди, ответы которых мне импонируют. Они всегда очень кратки и ценны и никогда не упоминают лишнее.

Насчет, help-ов, я например, в описании CreateProcess нигде
не встретил lpCommandLine should be a full command line in which the first element is the application name.


 
Reindeer Moss Eater ©   (2004-03-09 16:38) [14]

А это тоже не встретил?

lpCommandLine

Pointer to a null-terminated string that specifies the command line to execute.


А где тогда встретил это:

Второй параметр CreateProcess - набор параметров с которыми запускается приложение


 
Michail Dalakov ©   (2004-03-09 17:01) [15]

Второй параметр CreateProcess - набор параметров с которыми запускается приложение
If both lpApplicationName and lpCommandLine are non-NULL, the null-terminated string pointed to by lpApplicationName specifies the module to execute, and the null-terminated string pointed to by lpCommandLine specifies the command line.


 
Reindeer Moss Eater ©   (2004-03-09 17:10) [16]

Ну так откуда было высосано тождество между command line и набора параметров?


 
Michail Dalakov ©   (2004-03-09 17:50) [17]

Because argv[0] is the module name, C programmers generally repeat the module name as the first token in the command line.

Следовательно, ParamsStr(0) можно и неуказывать, что и делалось, и кстати не безуспешно, до момента пока не попался


 
Reindeer Moss Eater ©   (2004-03-09 18:09) [18]

Причем здесь "с-программерс" и почему "следовательно можно не указывать" - в толк я не возьму.

Возьми тестовое Delphi-приложение выводящее при старте
for i:=0 to ParamsCount do ShowMessage(ParamStr(i));

И позапускай его вторым тестовым Delphi-приложением
CreateProcess(PChar("dummy.exe"),
             PChar("first second third")),
             ....  

Помогает быстро избавиться от домыслов насчет "следовательно можно и не ...."


 
Michail Dalakov ©   (2004-03-09 18:52) [19]

Ну и ...

program RF;

{$APPTYPE CONSOLE}

uses Windows,SysUtils;

var
 i:Integer;
begin
 for i:=0 to ParamCount do WriteLn(ParamStr(i));
 Readln;
end.

procedure TForm1.Button1Click(Sender: TObject);
var
 SI: TStartupInfo;
 PI: TProcessInformation;
begin
 FillChar(SI, SizeOf(SI), 0);
 SI.cb := SizeOf(SI);
 if not CreateProcess("C:\Program Files\Borland\Delphi7\Projects\RF.exe"," first second third",nil,nil,false,Normal_Priority_Class,nil,nil,SI,PI)
 then raise Exception.CreateFmt("Error Code %d",[GetLastError]);
end;

Все запускается,

или я что-то не понял?


 
Reindeer Moss Eater ©   (2004-03-09 22:21) [20]

Мда...
Я вроде по-русски разговаривал всю дорогу.

Где я говорил, что НЕ ЗАПУСТИТСЯ?

Возьми тестовое Delphi-приложение выводящее при старте
for i:=0 to ParamsCount do ShowMessage(ParamStr(i));


Ты взял?
Ты посмотрел список параметров во втором аргументе своего CreateProcess?
Ты сравнил его с результатом работы запускаемого приложения?
Не нашел никаких отличий?


 
Reindeer Moss Eater ©   (2004-03-09 22:45) [21]

Теперь возвращаемся к первоначальному вопросу (ко второй половине):

То же самое через CreateProcess

CreateProcess(PChar(MainPathSvDb+"\Utils\rar.exe"),PChar(" a -m5 -df "E"+DtSvDb+".rar" "+"""+DtSvDb+"""),nil,nil,false,Normal_Priority_Class,nil,nil,SI,PI)
и все плохо,
хотя другие приложения через CreateProcess запускаются

GetLastError возвращает 0.


1. Рар на самом деле запускается.
2. Гетластеррор не врет, а врет кто-то другой.
3. Рар не создает новый архив, потому что занят выводом в консоль списка допустимых опций и команд (после того, как ему скормили кривую командную строку)
4. "Не запускается RAR" и "не создается архив" - две очень и очень большие разницы.


 
Michail Dalakov ©   (2004-03-10 13:52) [22]

Я больше пока не экспериментировал, но на основании выше изложенного можно сделать следующие выводы:

1. CreateProcess второй передаваемый параметр может воспринимать по-разному и не во всех случаях глотает первый параметр command line, иначе чем объяснить, что нормально работает
CreateProcess(PChar("C:\oracle\ora90\bin\exp.exe"),PChar(" "+FLoginPrms+"/"+FPassWordPrms+"@ODB9i file="+DtSvDb+".dmp log="+DtSvDb+".log"),nil,nil,false,Normal_Priority_Class,nil,nil,SI,PI)
здесь первым параметром command line передается login+password+
имя инстанции DB, без этого exp приостановился бы и попросил бы их ввести с консоли, т.к. этого не происходит, то можно сделать
соответствующий вывод.

Почему в некоторых случаях CreateProcess глотает первый параметр
науке неизвестно, я сначало предположил что это связано с типом приложения Win32 или Dos, но увы...

2. Для того чтобы не было лишних проблем лучше во втором параметре CreateProcess передавать full command line


 
Reindeer Moss Eater ©   (2004-03-10 14:05) [23]

2. Для того чтобы не было лишних проблем лучше во втором параметре CreateProcess передавать full command line

Не знаю что ты считаешь лучшим, и что такое "фул команд лайн", только в первоисточнике черным по белому и по-русски написано:

Pointer to a null-terminated string that specifies the command line to execute.


 
Michail Dalakov ©   (2004-03-10 14:49) [24]

В первоисточнике вместо full command line используется entire command line, но это же суть не меняет.

Я при первом чтении описания CreateProcess понял что вторым параметром должна быть command line без argv[0], хотя его можно и указать.

Даже сейчас когда я несколько раз пересмотрел описание не могу полностью согласиться с Reindeer Moss Eater ©  

Если бы не было остального контекста, то
Pointer to a null-terminated string that specifies the command line to execute. сказала бы все.

Если смотреть контекст, то возникает неоднозначность.
Бьюсь об заклад, что я не одинок в этом понимании и многие использовали CreateProcess не передавая entire command line и даже не подозревая о некоторых особенностях.

Я думаю тема закрыта.

Спасибо, Reindeer Moss Eater ©, за интересную беседу.



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2004.05.02;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.066 c
1-1082228872
oleg_SYS
2004-04-17 23:07
2004.05.02
Как изменить свойство компоненты другой формы


6-1078413082
xm-ad
2004-03-04 18:11
2004.05.02
TWebBrowser и frames


4-1078224931
Лекс
2004-03-02 13:55
2004.05.02
GetWindow в NT


14-1081765163
DeathMoroz
2004-04-12 14:19
2004.05.02
Скрипты


14-1081333019
Матлабист
2004-04-07 14:16
2004.05.02
Прикол





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский