Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как передать консоли конец цайла (EOF)? [D7, NT4, Win2k, WinXP]


Slym ©   (2004-02-12 19:04:00) 

По документации RAR имена архивируемых файлов может получать через StdIn...(rar a a.rar @) файл, перевод строки, файл перевод строки, конец файла... :

var
 sa:TSecurityAttributes;
 sd:TSecurityDescriptor;
 si:TStartupInfo;
 pi:TProcessInformation;
 INWPipe,INRPipe:THandle;
begin
 CmdLine:='rar a a.rar @';
 sa.nLength:=SizeOf(TSecurityAttributes);
 sa.lpSecurityDescriptor:=NIL;
 sa.bInheritHandle:=true;

 if CreatePipe(INRPipe,INWPipe,@sa,0) then
 try
   FillChar(si,SizeOf(si),#0);
   si.cb:=Sizeof(si);
   si.wShowWindow:=SW_HIDE;
   si.dwFlags:=STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
   si.hStdInput:=INRPipe;
   if CreateProcess(nil,PChar(CmdLine),nil,nil,TRUE,0,nil,nil,si,pi) then
   begin
     CloseHandle(INRPipe);
     WriteFile(INWPipe,a,Length(a),Writed,nil);
     CloseHandle(INWPipe);//Что закрытие пайпа, что посылка #26#13#10 (eof) один хрен! не пашет!
     if WaitForSingleObject(pi.hProcess,INFINITE)=WAIT_OBJECT_0 then
       GetExitCodeProcess(pi.hProcess,res)
     else res:=2;
     CloseHandle(pi.hProcess);
   end else Abort;
 except
     CloseHandle(INRPipe);
     CloseHandle(INWPipe);
 end;


Дык этот код не работает... Рар чего-то ждет...
Пробовал типа 'Copy con c:\1.txt' тоже не пашет...


Polevi   (2004-02-17 09:37:00) [1]

>Slym ©   (17.02.04 06:43) [5]
извини, но мне любопытно, в каких случаях нельзя сразу список файлов в командную строку передать ?


Slym   (2004-02-17 06:43:00) [2]

Так и есть закрываю пайп для записи в StdIn и Rar начинает паковать!
Тема закрыта!


Slym   (2004-02-17 05:01:00) [3]

Забираю свой последний пост...
Оказалось после закрытия программы архив всеже создавался!!!
Судя по всему после закрытия пайпов... всеже срабатывает "Конец файла"


Slym   (2004-02-17 04:51:00) [4]

Я тоже создал...
AddCommand('rar a z.rar unit1.pas unit1.dfm');

Но (читай первый пост), 'rar a z.rar @' - означает:
Rar получает имена не через Коммандную строку, а запрашивает их из STDIN (readln делает!), команда завершения ввода - конец файла (#26). прекращает запросы и приступает к архивированию.
Т.е. должно быть примерно так:
AddCommand('rar a z.rar @');
AddCommand('unit1.pas');
AddCommand('unit1.dfm');
AddCommand(#26);

Но не работает...


Polevi   (2004-02-16 10:46:00) [5]

ипользуя данный FAQ
http://www.delphimaster.ru/cgi-bin/faq.pl?look=1&id=1057316445&n=15
я создал архив вызовом
AddCommand('rar a z.rar unit1.pas unit1.dfm');


Slym   (2004-02-16 04:56:00) [6]

А данная прога вместо RAR работает... понимает и закрытие пайпа и #26#13#10 :
program Project2;

{$APPTYPE CONSOLE}
uses windows;

var a:array[0..1023] of char;
h:dword;
i:dword;
f:dword;
begin
 h:=GetStdHandle(STD_INPUT_HANDLE);
 ReadFile(h,a,1024,i,nil);
 f:=CreateFile('c:\test.txt',GENERIC_READ or GENERIC_WRITE,0,nil,CREATE_ALWAYS,0,0);
 WriteFile(f,a,i,i,nil);
 CloseHandle(f);
end.

Как рару сообщить что ввод закончен?


Наверх

Титульная страница Поиск, карта сайта Написать письмо