執行外部指令後的結果如何直接顯示在另一個memo上 |
答題得分者是:cubi
|
twiclch
一般會員 發表:1 回覆:7 積分:1 註冊:2006-07-14 發送簡訊給我 |
|
twiclch
一般會員 發表:1 回覆:7 積分:1 註冊:2006-07-14 發送簡訊給我 |
各位先進請教一個問題 我設計一個memo1顯示讀入一個文字檔,然後利用winexec的指令執行一個外部指令去檢查該文字檔 執行完的結果我想要顯示在另一個memo2 中顯示(之前我的方法是先將外部執行的結果存成暫存檔後,再將此 暫存檔讀入memo2中顯示,可是還沒有存完,程式反而已經完成讀檔的過程,所以會造成錯誤),我希望可以不用存成暫存檔而直接顯示在memo2除了可以顯示較快,也不用再產生另一個不用的暫存檔。不知道要用什麼樣的指令,可以完成這樣的工作。謝謝指教。 ps:檢查完的結果也是一個字數不少的文字檔。
------
周良 |
cubi
初階會員 發表:56 回覆:94 積分:35 註冊:2002-04-15 發送簡訊給我 |
procedure RunDosInMemo(DosApp:String;AMemo:TMemo); if Createpipe (ReadPipe, // address of variable for read handle FillChar(Start,Sizeof(Start),#0); start.hStdInput := ReadPipe; start.dwFlags := STARTF_USESTDHANDLES if CreateProcess(nil, ReadFile(ReadPipe, Buffer[BytesRead]:= #0; FreeMem(Buffer); procedure TForm1.Button1Click(Sender: TObject); |
twiclch
一般會員 發表:1 回覆:7 積分:1 註冊:2006-07-14 發送簡訊給我 |
|
twiclch
一般會員 發表:1 回覆:7 積分:1 註冊:2006-07-14 發送簡訊給我 |
|
Stallion
版主 發表:52 回覆:1600 積分:1995 註冊:2004-09-15 發送簡訊給我 |
不好意思,恕小弟多事~
你這個問題拖了一年才來回應,我想原答覆者不是早已遺忘,就是已經「涼」了吧?其他的網友看到這種情景想必也會興趣缺缺! 適時的回應與結案是對所有回覆者的一種尊重,還有這篇文章分類應該是「問題」,而不是「討論」,請修正一下~ ===================引 用 twiclch 文 章=================== 感謝您的回覆,測試後有一段時間了是沒有問題,但是如果遇到在dos 下顯示的資料文字內容很多時,教會down 掉,不知道這一段程式應該如可改進呢? 謝謝 |
twiclch
一般會員 發表:1 回覆:7 積分:1 註冊:2006-07-14 發送簡訊給我 |
還是先說一聲抱歉,我不是故意
之前測試沒問題時,已經回覆,但是不知道要結案,下次一定記住 這次是想利用這個程式將某些開放軟體在dos 執行後顯示的資訊,轉至memo 上顯示 因為顯示的資訊比較多,所以會當機,更改當中buffer的大小似乎沒用,所以才請教高手,絕非故意如此。 ===================引 用 Stallion 文 章=================== 不好意思,恕小弟多事~ 你這個問題拖了一年才來回應,我想原答覆者不是早已遺忘,就是已經「涼」了吧?其他的網友看到這種情景想必也會興趣缺缺! 適時的回應與結案是對所有回覆者的一種尊重,還有這篇文章分類應該是「問題」,而不是「討論」,請修正一下~ ===================引 用 twiclch 文 章=================== 感謝您的回覆,測試後有一段時間了是沒有問題,但是如果遇到在dos 下顯示的資料文字內容很多時,教會down 掉,不知道這一段程式應該如可改進呢? 謝謝
------
周良 |
Stallion
版主 發表:52 回覆:1600 積分:1995 註冊:2004-09-15 發送簡訊給我 |
1.把Loop調整看看如下~
2.版大!不是我不用程式碼區塊,而是一旦程式碼內容有地方要調整,必須全部程式碼重新調整一次!有點累~ procedure RunDosInMemo(DosApp:String;AMemo:TMemo); const ReadBuffer = 2048; var Security:TSecurityAttributes; ReadPipe,WritePipe:THandle; Start:TStartUpInfo; ProcessInfo:TProcessInformation; Buffer:Pchar; BytesRead:DWord; Apprunning:DWord; begin Security.nLength := sizeOf(TSecurityAttributes); Security.bInheritHandle := true; Security.lpSecurityDescriptor := nil; if Createpipe (ReadPipe,WritePipe,@Security,0) then begin Buffer := AllocMem(ReadBuffer); FillChar(Start,Sizeof(Start),#0); Start.cb := sizeOf(Start); Start.hStdOutput := WritePipe; Start.hStdInput := ReadPipe; Start.dwFlags := STARTF_USESTDHANDLES or 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); Repeat BytesRead := 0; ReadFile(ReadPipe,Buffer[0],ReadBuffer,BytesRead,nil); Buffer[BytesRead]:= #0; AMemo.Text := AMemo.Text String(Buffer); until (BytesRead < ReadBuffer); Application.ProcessMessages; until (Apprunning <> WAIT_TIMEOUT ); end; FreeMem(Buffer); CloseHandle(ProcessInfo.hProcess); CloseHandle(ProcessInfo.hThread); CloseHandle(ReadPipe); CloseHandle(WritePipe); end; end; procedure TForm1.Button1Click(Sender: TObject); begin RunDosInMemo('ping 192.168.1.10 -t',Memo1); end; procedure TForm1.Memo1Change(Sender: TObject); begin SendMessage(Memo1.handle,WM_VSCROLL,SB_BOTTOM,0); end; ===================引 用 twiclch 文 章=================== 還是先說一聲抱歉,我不是故意 之前測試沒問題時,已經回覆,但是不知道要結案,下次一定記住 這次是想利用這個程式將某些開放軟體在dos 執行後顯示的資訊,轉至memo 上顯示 因為顯示的資訊比較多,所以會當機,更改當中buffer的大小似乎沒用,所以才請教高手,絕非故意如此。 ===================引 用 Stallion 文 章=================== 不好意思,恕小弟多事~ 你這個問題拖了一年才來回應,我想原答覆者不是早已遺忘,就是已經「涼」了吧?其他的網友看到這種情景想必也會興趣缺缺! 適時的回應與結案是對所有回覆者的一種尊重,還有這篇文章分類應該是「問題」,而不是「討論」,請修正一下~ ===================引 用 twiclch 文 章=================== 感謝您的回覆,測試後有一段時間了是沒有問題,但是如果遇到在dos 下顯示的資料文字內容很多時,教會down 掉,不知道這一段程式應該如可改進呢? 謝謝 |
twiclch
一般會員 發表:1 回覆:7 積分:1 註冊:2006-07-14 發送簡訊給我 |
|
Stallion
版主 發表:52 回覆:1600 積分:1995 註冊:2004-09-15 發送簡訊給我 |
不曉得你的CONSOLE程式是輸出怎樣的訊息?Buffer的大小並不會因為訊息太長而接收不了,看看程式碼你就知道,他會反覆讀取一直到訊息讀取完畢。該注意的是那個CONSOLE的輸出會不會有不可列印等控制字元?如果是,那麼讀取至BUFFER時尚不會有問題,但是轉到MEMO終究會發生問題。你debug看看,是不是有上述的狀況。
===================引 用 twiclch 文 章=================== 感謝您,這麼快就回覆。我試了一下,情況還是一樣,也就是對短的訊息可以顯示,但是太長的訊息還是無法顯示而當機了。 謝謝 |
twiclch
一般會員 發表:1 回覆:7 積分:1 註冊:2006-07-14 發送簡訊給我 |
Stallion 高手您好:
首先還是致上我最大的敬意,能夠這麼快的得到您的回覆,對我的幫助非常大。 我先調整 ReadBuffer = 20480 的大小,目前看起來,讀出來的訊息是可以完整的呈現, 不過您的建議中提到是否會出現不可預期的控制字元,我想這是一個方向,我會注意的。 再一次的感謝您的協助。 ===================引 用 Stallion 文 章=================== 不曉得你的CONSOLE程式是輸出怎樣的訊息?Buffer的大小並不會因為訊息太長而接收不了,看看程式碼你就知道,他會反覆讀取一直到訊息讀取完畢。該注意的是那個CONSOLE的輸出會不會有不可列印等控制字元?如果是,那麼讀取至BUFFER時尚不會有問題,但是轉到MEMO終究會發生問題。你debug看看,是不是有上述的狀況。 ===================引 用 twiclch 文 章=================== 感謝您,這麼快就回覆。我試了一下,情況還是一樣,也就是對短的訊息可以顯示,但是太長的訊息還是無法顯示而當機了。 謝謝
------
周良 |
twiclch
一般會員 發表:1 回覆:7 積分:1 註冊:2006-07-14 發送簡訊給我 |
Stallion?高手您好:
對不起,我結案時按錯了解答者,所以… 真的很抱歉! ===================引 用 twiclch 文 章=================== Stallion?高手您好: 首先還是致上我最大的敬意,能夠這麼快的得到您的回覆,對我的幫助非常大。 我先調整 ReadBuffer = 20480 的大小,目前看起來,讀出來的訊息是可以完整的呈現, 不過您的建議中提到是否會出現不可預期的控制字元,我想這是一個方向,我會注意的。 再一次的感謝您的協助。 ===================引 用 Stallion 文 章=================== 不曉得你的CONSOLE程式是輸出怎樣的訊息?Buffer的大小並不會因為訊息太長而接收不了,看看程式碼你就知道,他會反覆讀取一直到訊息讀取完畢。該注意的是那個CONSOLE的輸出會不會有不可列印等控制字元?如果是,那麼讀取至BUFFER時尚不會有問題,但是轉到MEMO終究會發生問題。你debug看看,是不是有上述的狀況。 ===================引 用 twiclch 文 章=================== 感謝您,這麼快就回覆。我試了一下,情況還是一樣,也就是對短的訊息可以顯示,但是太長的訊息還是無法顯示而當機了。 謝謝
------
周良 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |