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

執行外部指令後的結果如何直接顯示在另一個memo上

答題得分者是:cubi
twiclch
一般會員


發表:1
回覆:7
積分:1
註冊:2006-07-14

發送簡訊給我
#1 引用回覆 回覆 發表時間:2006-07-14 10:36:50 IP:61.70.xxx.xxx 訂閱
------
周良
編輯記錄
twiclch 重新編輯於 2007-06-10 16:52:33, 註解 無‧
twiclch
一般會員


發表:1
回覆:7
積分:1
註冊:2006-07-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2006-07-14 10:39:33 IP:61.70.xxx.xxx 訂閱

各位先進請教一個問題

我設計一個memo1顯示讀入一個文字檔,然後利用winexec的指令執行一個外部指令去檢查該文字檔

執行完的結果我想要顯示在另一個memo2 中顯示(之前我的方法是先將外部執行的結果存成暫存檔後,再將此

暫存檔讀入memo2中顯示,可是還沒有存完,程式反而已經完成讀檔的過程,所以會造成錯誤),我希望可以不用存成暫存檔而直接顯示在memo2除了可以顯示較快,也不用再產生另一個不用的暫存檔。不知道要用什麼樣的指令,可以完成這樣的工作。謝謝指教。

ps:檢查完的結果也是一個字數不少的文字檔。

------
周良
cubi
初階會員


發表:56
回覆:94
積分:35
註冊:2002-04-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2006-07-14 15:02:31 IP:203.187.xxx.xxx 未訂閱

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, // address of variable for read handle
WritePipe, // address of variable for write handle
@Security, // pointer to security attributes
0) // number of bytes reserved for pipe
then
begin
//param := #0;
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;

procedure TForm1.Button1Click(Sender: TObject);
begin
//RunDosInMemo('ping 192.68.1.1',Memo1);
RunDosInMemo('netstat',Memo1);
end;

twiclch
一般會員


發表:1
回覆:7
積分:1
註冊:2006-07-14

發送簡訊給我
#4 引用回覆 回覆 發表時間:2006-07-14 17:47:01 IP:61.70.xxx.xxx 訂閱

感謝cubi大大的解惑,

困擾多時的問題一下子就解決了

謝謝!

------
周良
twiclch
一般會員


發表:1
回覆:7
積分:1
註冊:2006-07-14

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-06-10 13:21:47 IP:61.70.xxx.xxx 訂閱
感謝您的回覆,測試後有一段時間了是沒有問題,但是如果遇到在dos 下顯示的資料文字內容很多時,教會down 掉,不知道這一段程式應該如可改進呢?
謝謝
------
周良
Stallion
版主


發表:52
回覆:1600
積分:1995
註冊:2004-09-15

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-06-10 13:50:39 IP:211.22.xxx.xxx 未訂閱
不好意思,恕小弟多事~
你這個問題拖了一年才來回應,我想原答覆者不是早已遺忘,就是已經「涼」了吧?其他的網友看到這種情景想必也會興趣缺缺!
適時的回應與結案是對所有回覆者的一種尊重,還有這篇文章分類應該是「問題」,而不是「討論」,請修正一下~
===================引 用 twiclch 文 章===================
感謝您的回覆,測試後有一段時間了是沒有問題,但是如果遇到在dos 下顯示的資料文字內容很多時,教會down 掉,不知道這一段程式應該如可改進呢?
謝謝
twiclch
一般會員


發表:1
回覆:7
積分:1
註冊:2006-07-14

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-06-10 17:02:39 IP:61.70.xxx.xxx 訂閱
還是先說一聲抱歉,我不是故意
之前測試沒問題時,已經回覆,但是不知道要結案,下次一定記住
這次是想利用這個程式將某些開放軟體在dos 執行後顯示的資訊,轉至memo 上顯示
因為顯示的資訊比較多,所以會當機,更改當中buffer的大小似乎沒用,所以才請教高手,絕非故意如此。
===================引 用 Stallion 文 章===================
不好意思,恕小弟多事~
你這個問題拖了一年才來回應,我想原答覆者不是早已遺忘,就是已經「涼」了吧?其他的網友看到這種情景想必也會興趣缺缺!
適時的回應與結案是對所有回覆者的一種尊重,還有這篇文章分類應該是「問題」,而不是「討論」,請修正一下~
===================引 用 twiclch 文 章===================
感謝您的回覆,測試後有一段時間了是沒有問題,但是如果遇到在dos 下顯示的資料文字內容很多時,教會down 掉,不知道這一段程式應該如可改進呢?
謝謝
------
周良
Stallion
版主


發表:52
回覆:1600
積分:1995
註冊:2004-09-15

發送簡訊給我
#8 引用回覆 回覆 發表時間:2007-06-10 21:52:55 IP:211.22.xxx.xxx 未訂閱
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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2007-06-10 23:38:46 IP:61.70.xxx.xxx 訂閱
感謝您,這麼快就回覆。我試了一下,對較長的訊息可以顯示,但是會當機。有點奇怪。
謝謝
------
周良
編輯記錄
twiclch 重新編輯於 2007-06-10 23:46:34, 註解 無‧
twiclch 重新編輯於 2007-06-11 00:00:09, 註解 無‧
Stallion
版主


發表:52
回覆:1600
積分:1995
註冊:2004-09-15

發送簡訊給我
#10 引用回覆 回覆 發表時間:2007-06-10 23:59:21 IP:211.22.xxx.xxx 未訂閱
不曉得你的CONSOLE程式是輸出怎樣的訊息?Buffer的大小並不會因為訊息太長而接收不了,看看程式碼你就知道,他會反覆讀取一直到訊息讀取完畢。該注意的是那個CONSOLE的輸出會不會有不可列印等控制字元?如果是,那麼讀取至BUFFER時尚不會有問題,但是轉到MEMO終究會發生問題。你debug看看,是不是有上述的狀況。
===================引 用 twiclch 文 章===================
感謝您,這麼快就回覆。我試了一下,情況還是一樣,也就是對短的訊息可以顯示,但是太長的訊息還是無法顯示而當機了。
謝謝
twiclch
一般會員


發表:1
回覆:7
積分:1
註冊:2006-07-14

發送簡訊給我
#11 引用回覆 回覆 發表時間:2007-06-11 00:13:13 IP:61.70.xxx.xxx 訂閱
Stallion 高手您好:
首先還是致上我最大的敬意,能夠這麼快的得到您的回覆,對我的幫助非常大。
我先調整 ReadBuffer = 20480 的大小,目前看起來,讀出來的訊息是可以完整的呈現,
不過您的建議中提到是否會出現不可預期的控制字元,我想這是一個方向,我會注意的。
再一次的感謝您的協助。

===================引 用 Stallion 文 章===================
不曉得你的CONSOLE程式是輸出怎樣的訊息?Buffer的大小並不會因為訊息太長而接收不了,看看程式碼你就知道,他會反覆讀取一直到訊息讀取完畢。該注意的是那個CONSOLE的輸出會不會有不可列印等控制字元?如果是,那麼讀取至BUFFER時尚不會有問題,但是轉到MEMO終究會發生問題。你debug看看,是不是有上述的狀況。
===================引 用 twiclch 文 章===================
感謝您,這麼快就回覆。我試了一下,情況還是一樣,也就是對短的訊息可以顯示,但是太長的訊息還是無法顯示而當機了。
謝謝
------
周良
twiclch
一般會員


發表:1
回覆:7
積分:1
註冊:2006-07-14

發送簡訊給我
#12 引用回覆 回覆 發表時間:2007-06-11 00:19:12 IP:61.70.xxx.xxx 訂閱
Stallion?高手您好:
對不起,我結案時按錯了解答者,所以…
真的很抱歉!
===================引 用 twiclch 文 章===================
Stallion?高手您好:
首先還是致上我最大的敬意,能夠這麼快的得到您的回覆,對我的幫助非常大。
我先調整 ReadBuffer = 20480 的大小,目前看起來,讀出來的訊息是可以完整的呈現,
不過您的建議中提到是否會出現不可預期的控制字元,我想這是一個方向,我會注意的。
再一次的感謝您的協助。

===================引 用 Stallion 文 章===================
不曉得你的CONSOLE程式是輸出怎樣的訊息?Buffer的大小並不會因為訊息太長而接收不了,看看程式碼你就知道,他會反覆讀取一直到訊息讀取完畢。該注意的是那個CONSOLE的輸出會不會有不可列印等控制字元?如果是,那麼讀取至BUFFER時尚不會有問題,但是轉到MEMO終究會發生問題。你debug看看,是不是有上述的狀況。
===================引 用 twiclch 文 章===================
感謝您,這麼快就回覆。我試了一下,情況還是一樣,也就是對短的訊息可以顯示,但是太長的訊息還是無法顯示而當機了。
謝謝
------
周良
系統時間:2017-12-17 17:49:14
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!