Форум: "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.031 c