全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1252
推到 Plurk!
推到 Facebook!

關於Dos程式導向問題

尚未結案
aAlan
一般會員


發表:38
回覆:24
積分:12
註冊:2004-07-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-07-28 19:48:25 IP:61.30.xxx.xxx 未訂閱
這支程式是可以將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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-07-28 20:49:09 IP:211.20.xxx.xxx 未訂閱
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-07-29 13:02:34 IP:211.76.xxx.xxx 未訂閱
版主您好:     我懂您的意思了,不管如何每一次讀取,必定是讀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
系統時間:2024-05-03 23:52:23
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!