![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
CreateProcess [D7, WinXP]
MichailDalakov © (2004-03-09 12:54:00)Почему не отрабатывает 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.
Michail Dalakov (2004-03-10 14:49:00) [1]В первоисточнике вместо 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 ©, за интересную беседу.
Reindeer Moss Eater (2004-03-10 14:05:00) [2]2. Для того чтобы не было лишних проблем лучше во втором параметре CreateProcess передавать full command line
Не знаю что ты считаешь лучшим, и что такое "фул команд лайн", только в первоисточнике черным по белому и по-русски написано:
Pointer to a null-terminated string that specifies the command line to execute.
Michail Dalakov (2004-03-10 13:52:00) [3]Я больше пока не экспериментировал, но на основании выше изложенного можно сделать следующие выводы:
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-09 22:45:00) [4]Теперь возвращаемся к первоначальному вопросу (ко второй половине):
То же самое через 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" и "не создается архив" - две очень и очень большие разницы.
Reindeer Moss Eater (2004-03-09 22:21:00) [5]Мда...
Я вроде по-русски разговаривал всю дорогу.
Где я говорил, что НЕ ЗАПУСТИТСЯ?
Возьми тестовое Delphi-приложение выводящее при старте
for i:=0 to ParamsCount do ShowMessage(ParamStr(i));
Ты взял?
Ты посмотрел список параметров во втором аргументе своего CreateProcess?
Ты сравнил его с результатом работы запускаемого приложения?
Не нашел никаких отличий?
Michail Dalakov (2004-03-09 18:52:00) [6]Ну и ...
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 18:09:00) [7]Причем здесь "с-программерс" и почему "следовательно можно не указывать" - в толк я не возьму.
Возьми тестовое Delphi-приложение выводящее при старте
for i:=0 to ParamsCount do ShowMessage(ParamStr(i));
И позапускай его вторым тестовым Delphi-приложением
CreateProcess(PChar('dummy.exe'),
PChar('first second third')),
....
Помогает быстро избавиться от домыслов насчет " следовательно можно и не ...."
Michail Dalakov (2004-03-09 17:50:00) [8]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 17:10:00) [9]Ну так откуда было высосано тождество между commandline и набора параметров?
Michail Dalakov (2004-03-09 17:01:00) [10]Второй параметр 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 16:38:00) [11]А это тоже не встретил?
lpCommandLine
Pointer to a null-terminated string that specifies the command line to execute.
А где тогда встретил это:
Второй параметр CreateProcess - набор параметров с которыми запускается приложение
MichailDalakov (2004-03-09 16:33:00) [12]Если, честно, то я ни с кем не хочу беседовать на стороние темы,
мнения всех участников форума я ценю, но есть люди, ответы которых мне импонируют. Они всегда очень кратки и ценны и никогда не упоминают лишнее.
Насчет, help-ов, я например, в описании CreateProcess нигде
не встретил lpCommandLine should be a full command line in which the first element is the application name.
Michail Dalakov (2004-03-09 16:07:00) [13]A кто-то сразу понял, что в [8] имелось ввиду [7],
Нет, нет, нет я больше ничего не скажу...
Молчу, молчу, молчу...
Diamond Cat (2004-03-09 15:40:00) [14]
> Michail Dalakov © (09.03.04 15:16) [8]
> Воспользовался Игорь Шевченко ©
Игорь, тебе понравилось ?????? :о)
Reindeer Moss Eater (2004-03-09 15:36:00) [15]Меньше часа челу потребовалось, что бы поверить в [1].
Не так уж и плохо.
Игорь Шевченко (2004-03-09 15:28:00) [16]
> Воспользовался Игорь Шевченко © (09.03.04 14:04) [7]
> все OK!
Если быть точным, то это не мой совет, а help, который надо любить и читать.
Michail Dalakov (2004-03-09 15:16:00) [17]Воспользовался Игорь Шевченко © (09.03.04 14:04) [7]
все OK!
Насчет мамы не понял, я просто отвечал на поставленный ранее вопрос.
Всем, спасибо.
Игорь Шевченко (2004-03-09 14:04:00) [18]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.
Reindeer Moss Eater (2004-03-09 13:56:00) [19]Второй параметр CreateProcess - набор параметров с которыми запускается приложение
Кто это сказал? Мама?
Второй параметр - string that specifies the command line to execute.
Это командная строка которая должна быть выполнена.
Даже если ты ее рассматриваешь как список параметров, то почему передаешь только ParamsStr(1), ParamsStr(2), ParamsStr(N)?
Где ParamsStr( 0)?
MichailDalakov (2004-03-09 13:53:00) [20]Второй параметр 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)
и все ОК!