關於Dos程式導向問題 |
尚未結案
|
aAlan
一般會員 發表:38 回覆:24 積分:12 註冊:2004-07-23 發送簡訊給我 |
這支程式是可以將dos mode ping結果把它導向到memo1上。 如下●所示,不知道為何until的條件要BytesRead < ReadBuffer,如果ReadBuffer裡面還有資料,
不是就漏讀了嗎?
有沒有人有實際去RUN過這支程式? RunDosInMemo('ping -n 1 localhost ',Memo1); procedure RunDosInMemo(DosApp:String;AMemo:TMemo);
const ReadBuffer = 2400;
var Security : TSecurityAttributes;
ReadPipe,WritePipe : THandle;
start : TStartUpInfo;
ProcessInfo : TProcessInformation;
Buffer : Pchar;
BytesRead : DWord;
Apprunning : DWord;
begin
With Security do begin
nlength := SizeOf(TSecurityAttributes);
binherithandle := true;
lpsecuritydescriptor := nil;
end;
if Createpipe (ReadPipe, WritePipe, @Security, 0) then begin
Buffer := AllocMem(ReadBuffer 1);
FillChar(Start,Sizeof(Start),#0);
start.cb := SizeOf(start);
start.hStdOutput := WritePipe;
start.hStdInput := ReadPipe;
start.dwFlags := STARTF_USESTDHANDLES STARTF_USESHOWWINDOW;
start.wShowWindow := SW_HIDE;
if CreateProcess(nil,PChar(DosApp),@Security,@Security,true,NORMAL_PRIORITY_CLASS,
nil,nil,start,ProcessInfo) then begin
repeat
Apprunning := WaitForSingleObject(ProcessInfo.hProcess,100);
Application.ProcessMessages;
until (Apprunning <> WAIT_TIMEOUT);
Repeat
BytesRead := 0;
ReadFile(ReadPipe,Buffer[0],ReadBuffer,BytesRead,nil);
Buffer[BytesRead]:= #0;
OemToAnsi(Buffer,Buffer);
AMemo.Text := AMemo.text String(Buffer);
●until (BytesRead < ReadBuffer);
end;
FreeMem(Buffer);
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
CloseHandle(ReadPipe);
CloseHandle(WritePipe);
end;
end; RunDosInMemo('ping -n 1 localhost ',Memo1);
|
Chance36
版主 發表:31 回覆:1033 積分:792 註冊:2002-12-31 發送簡訊給我 |
aAlan 你好
嘗試著說明如下,希望你可以了解 { Buffer : 實際讀進來的內容 BytesRead : 取入buffer的Bytes 數 ReadBuffer: 一次最多讀取的Byte數(2400) } Repeat BytesRead := 0; ReadFile(ReadPipe,Buffer[0],ReadBuffer,BytesRead,nil); // 從ReadPipe 讀取最多 ReadBuffer個字元放到Buffer[0]開始的記憶體位置上 // 然後把實際放到Buffer中的Bytes數記錄到BytesRead變數中 Buffer[BytesRead]:= #0; // 在讀入的資料最後填入#0代表資料結束 OemToAnsi(Buffer,Buffer); AMemo.Text := AMemo.text String(Buffer); // 將讀入的資料放到Memo中 until (BytesRead < ReadBuffer); // 判斷實際讀取的Bytes數是否小於最多讀取的Bytes數 // 當實際讀取的Bytes數小於最多讀取的Bytes數 時表示資料已讀完了。 // 若實際讀取的Bytes數=最多讀取的Bytes數 時表示資料還沒讀完,繼續跑迴圈。_______________________________________ 深藍的魚,祝您好運..........連連 發表人 - chance36 於 2004/07/28 21:06:57 |
aAlan
一般會員 發表:38 回覆:24 積分:12 註冊:2004-07-23 發送簡訊給我 |
版主您好:
我懂您的意思了,不管如何每一次讀取,必定是讀buffer這麼多byte,也就是2400,如果資料有4800,則一次就會讀2400,需要兩次才能讀完,
如果資料僅有200,則一次無法讀滿2400,我們就可以判定資料已經讀完了! 真的很謝謝您的啟蒙!
引言: aAlan 你好嘗試著說明如下,希望你可以了解 { Buffer : 實際讀進來的內容 BytesRead : 取入buffer的Bytes 數 ReadBuffer: 一次最多讀取的Byte數(2400) } Repeat BytesRead := 0; ReadFile(ReadPipe,Buffer[0],ReadBuffer,BytesRead,nil); // 從ReadPipe 讀取最多 ReadBuffer個字元放到Buffer[0]開始的記憶體位置上 // 然後把實際放到Buffer中的Bytes數記錄到BytesRead變數中 Buffer[BytesRead]:= #0; // 在讀入的資料最後填入#0代表資料結束 OemToAnsi(Buffer,Buffer); AMemo.Text := AMemo.text String(Buffer); // 將讀入的資料放到Memo中 until (BytesRead < ReadBuffer); // 判斷實際讀取的Bytes數是否小於最多讀取的Bytes數 // 當實際讀取的Bytes數小於最多讀取的Bytes數 時表示資料已讀完了。 // 若實際讀取的Bytes數=最多讀取的Bytes數 時表示資料還沒讀完,繼續跑迴圈。_______________________________________ 深藍的魚,祝您好運..........連連 發表人 - chance36 於 2004/07/28 21:06:57 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |