-
Мало ли что тебе хочется) Чужой процесс волен выводить 3 символа целый час, а следующие 97 символов за десятую секунды. Хочешь получить свои 100 "все сразу", за один вызов ReadFile ? Придется ждать час с лишним ? Не хочешь при этом "висеть" ? Читай пайп в доп.потоке.
-
да не понял ты меня, что ты хочешь сказать что просто чтение , когда есть что читать может длиться несколько минут???
-
Хочешь сказать, что PeekNamedPipe сказал тебе, что имеются к чтению 100 байт, ты тут же вызвал ReadFile, заказав к чтению 100 байт - и ReadFile при этом выполняется несколько минут ?
-
да нет просто сразу как только программа запустилась уже есть что считывать но она почему то не читает, даже использование PeekNamedPipe почему то ничего не дает, не знаю что не так
-
почему долго не считывает, а потом выдает целую кучу, что я опять не так сделал вроде уже все посмотрел что бы было как надо
-
переделал вот так но почему то все равно мне выводит огромное количество строк, хотя должно выводить как я понимаю только одну строку, что опять сделал не так уже мозг кипит , не могу понять
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
public
end;
var
Form1: TForm1;
implementation
procedure RunDosInMemo(DosApp:String;AMemo:TMemo) ;
var
l:boolean;
dwAvail:Cardinal;
Security : TSecurityAttributes;
ReadPipe,WritePipe : THandle;
start : TStartUpInfo;
ProcessInfo : TProcessInformation;
BytesRead : DWord;
Apprunning : DWord;
x : Integer;
MyStr,s : String;
begin
x := 0;
With Security do
begin
Security.nlength := SizeOf(TSecurityAttributes) ;
Security.binherithandle := true;
Security.lpsecuritydescriptor := nil;
end;
if Createpipe (ReadPipe, WritePipe,
@Security, 0) then
begin
ZeroMemory(@start, SizeOf(TStartupInfo)); ;
start.cb := SizeOf(STARTUPINFO) ;
start.hStdOutput := WritePipe;
start.hStdInput := 0;
start.dwFlags := STARTF_USESTDHANDLES ;
start.wShowWindow := SW_SHOW;
if CreateProcess(nil,
PChar(DosApp),
@Security,
@Security,
true,
NORMAL_PRIORITY_CLASS,
nil,
nil,
start,
ProcessInfo)
then
begin
CloseHandle(WritePipe) ;
repeat
PeekNamedPipe(ReadPipe, nil, 0, nil, @dwAvail, nil);
if dwAvail>0 then
begin
SetLength(S, dwAvail);
ReadFile(ReadPipe,PChar(S)^, Length(S), BytesRead,nil);
ShowMessage(s);
Break;
end;
until(dwAvail>0);
CloseHandle(ProcessInfo.hProcess) ;
CloseHandle(ProcessInfo.hThread) ;
CloseHandle(ReadPipe) ;
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
RunDosInMemo('c:\1\mxi-7.1-eu.exe c:\1\client.ini',memo1) ;
end;
end.
-
> mamedovvms © (26.08.09 07:01) [25]
> одну строку, что опять сделал не так уже мозг кипит , не > могу понять
procedure RunDosInMemo(DosApp:String;AMemo:TMemo) ;
var
Security : TSecurityAttributes;
ReadPipe,WritePipe : THandle;
start : TStartUpInfo;
ProcessInfo : TProcessInformation;
BytesRead : DWord;
s: String;
buf : array [0..4095] of Char;
begin
With Security do
begin
Security.nlength := SizeOf(TSecurityAttributes) ;
Security.binherithandle := true;
Security.lpsecuritydescriptor := nil;
end;
if Createpipe (ReadPipe, WritePipe,
@Security, 0) then
begin
ZeroMemory(@start, SizeOf(TStartupInfo)); ;
start.cb := SizeOf(STARTUPINFO) ;
start.hStdOutput := WritePipe;
start.hStdError := WritePipe;
start.dwFlags := STARTF_USESTDHANDLES ;
start.wShowWindow := SW_SHOW;
if CreateProcess(nil,
PChar(DosApp),
nil,
nil,
true,
NORMAL_PRIORITY_CLASS,
nil,
nil,
start,
ProcessInfo)
then
begin
CloseHandle(WritePipe) ;
CloseHandle(ProcessInfo.hThread) ;
repeat
if not ReadFile(ReadPipe, buf[0], SizeOf(buf), BytesRead,nil) then
Break;
SetString(s, buf, BytesRead);
AMemo.SelText := s;
until (BytesRead = 0) and
(WaitForSingleObject(ProcessInfo.hProcess, 0) = WAIT_OBJECT_0);
CloseHandle(ProcessInfo.hProcess) ;
CloseHandle(ReadPipe) ;
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
RunDOSinMemo('ping localhost', memo1);
end;
Но, во-ще, за такой код убивать надо, из рогатки. -- Regards, LVT.
-
ну попробывать то конечно можно но как бы не советовал это раз, а во вторых я думаю лучше бы подсказали что и как надо сделать
-
> mamedovvms © (26.08.09 09:57) [27]
> раз, а во вторых я думаю лучше бы подсказали что и как надо > сделать
Примерно так: http://groups.google.com/group/fido7.ru.delphi/msg/b67d07fe0087e067Но, и там ошибок хватает. Главная, BeginThread instead CreateThread, ну и там по-мелочи еще. Но, за основу проще взять и подработать напильником. -- Regards, LVT.
-
ладно, а подскажи пожалуйста , вот у меня есть консольное приложение 1.exe это приложение считывает данные которые ему надо из файла 2.txt как при запуске 1.exe передать параметр 2.txt
-
> mamedovvms © (26.08.09 10:25) [29]
> это приложение считывает данные которые ему надо из файла > 2.txt как при запуске 1.exe передать параметр 2.txt
В двойных кавычках. see AnsiQuotedStr function. Параметры разделяются пробелом.
-- Regards, LVT.
-
то есть где мне надо это приписать , если не сложно объясните поконкретнее
-
то есть мне не понятно где в моем коде это надо прописать здесь if CreateProcess(nil,
PChar(DosApp),
nil,
nil,
true,
NORMAL_PRIORITY_CLASS,
nil,
nil,
start,
ProcessInfo) или RunDOSinMemo('ping localhost', memo1); и как AnsiQuotedStr ("2.txt"); так%
-
> mamedovvms © (26.08.09 10:41) [32]
> RunDOSinMemo('ping localhost', memo1);
var
s: String;
s := Format('\"%s\" \"%s\"', [FullPathNameExeFile, FullPathNameParamFile]);
RunDOSinMemo(s, memo1);
-- Regards, LVT.
-
то есть должно получиться так ??? procedure RunDosInMemo(DosApp:String;AMemo:TMemo) ; var Security : TSecurityAttributes; ReadPipe,WritePipe : THandle; start : TStartUpInfo; ProcessInfo : TProcessInformation; BytesRead : DWord; s: String; buf : array [0..4095] of Char; begin
With Security do begin Security.nlength := SizeOf(TSecurityAttributes) ; Security.binherithandle := true; Security.lpsecuritydescriptor := nil; end;
if Createpipe (ReadPipe, WritePipe, @Security, 0) then begin ZeroMemory(@start, SizeOf(TStartupInfo)); ; start.cb := SizeOf(STARTUPINFO) ; start.hStdOutput := WritePipe; start.hStdError := WritePipe;
start.dwFlags := STARTF_USESTDHANDLES ; start.wShowWindow := SW_SHOW;
if CreateProcess(nil, PChar(DosApp), nil, nil, true, NORMAL_PRIORITY_CLASS, nil, nil, start, ProcessInfo) then begin CloseHandle(WritePipe) ; CloseHandle(ProcessInfo.hThread) ;
repeat
if not ReadFile(ReadPipe, buf[0], SizeOf(buf), BytesRead,nil) then Break; SetString(s, buf, BytesRead); AMemo.SelText := s; until (BytesRead = 0) and (WaitForSingleObject(ProcessInfo.hProcess, 0) = WAIT_OBJECT_0);
CloseHandle(ProcessInfo.hProcess) ;
CloseHandle(ReadPipe) ;
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject); var s:string; begin
s := Format('"1.exe" "2.txt"', [FullPathNameExeFile, FullPathNameParamFile]); RunDOSinMemo(s, memo1); end;
-
> mamedovvms © (26.08.09 11:35) [34]
> s := Format('"1.exe" "2.txt"', [FullPathNameExeFile, FullPathNameParamFile]);
Здесь самодеятельность не нужна, здесь требуется сосредоточится на именах файлов вместе с полными путями к ним.
И не надо повторно постить RunDosInMemo, от нее нас тошнит.
Гм.. я про напильник, а руки, небось к топору привыкли.
-- Regards, LVT.
-
лучше не знать к чему привыкли мои руки, что так трудно ответить или просто или вы просто не падете так низко что бы нормально ответить что и где как создать ???? неужели так сложно, или просто ваш профессионализм не позволяет???
-
> что так трудно ответить
Что, так трудно заглянуть в справку к ф-ции Format() ? А заодно и к WaitForSingleObject ?
-
не надо лишних комментариев, вы тоже не асы во всем
-
> не надо лишних комментариев
Не надо брать на слабо. Так что мешает ?
|