無法取得TIdTelnet的回應內容 |
缺席
|
JammyHsu
一般會員 發表:14 回覆:39 積分:10 註冊:2003-09-08 發送簡訊給我 |
我將原本放在mainform的telnet程式改放到dll裡
結果OnDataAvailable都無法收到訊息
等到timeout後, 出現訊息視窗, 才收到回應
我在想是不是Application.ProcessMessages這邊廻圈的問題
但是廻圈拿掉就也是不等回應就結束了
如同之前發問的問題一樣
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=46220
煩請前輩們賜教! 程式如下:
TelnetPrompt : array [1..3] of String = ('login:', 'password:', '@mail)/'); function Telnet(const tServer: String; const tPort: Integer; const tCmdList: TStringList): Boolean;
var
i, j: Integer;
CmdStr: String;
BeginTick: DWORD;
dmTelnet: TInternetDM;
begin
Result:=False;
dmTelnet:=TInternetDM.Create;
with dmTelnet.IdTelnet1 do
begin
Host:=tServer;
Port:=tPort;
try
if Connected then Disconnect;
TelnetFlag:=False;
Connect; for i:=0 to tCmdList.Count-1 do
begin
Result:=False;
CmdStr:=tCmdList.Strings[i];
BeginTick:=GetTickCount;
while (not TelnetFlag) and (GetTickCount - BeginTick < 10000) do // 收到提示訊息 或 超過10秒
Application.ProcessMessages;
if not TelnetFlag then
begin
ShowMessage('等待訊息已超過預設10秒鐘' #13 '可能斷線或忙線或語法不合, 將強制中斷' #13 '目前停留在 [' CmdStr ']');
break;
end; for j:=1 to Length(tCmdList.Strings[i]) do
SendCh(CmdStr[j]);
SendCh(#13);
TelnetFlag:=False;
Result:=True;
end;
Disconnect;
except
on E: Exception do
ErrorMessage('遠端控制命令傳送失敗:' E.Message);
end;
end;
end; procedure TInternetDM.IdTelnet1DataAvailable(Sender: TIdTelnet;
const Buffer: String);
var
i: Integer;
sBuf: String;
begin
sBuf:=LowerCase(Trim(sBuf));
if sBuf='' then
exit;
for i:=1 to Length(TelnetPrompt) do
if Pos(TelnetPrompt[i], Buffer)>0 then
begin
TelnetFlag:=True;
break;
end;
end;
|
JammyHsu
一般會員 發表:14 回覆:39 積分:10 註冊:2003-09-08 發送簡訊給我 |
|
JammyHsu
一般會員 發表:14 回覆:39 積分:10 註冊:2003-09-08 發送簡訊給我 |
|
zycagod
一般會員 發表:0 回覆:14 積分:12 註冊:2002-07-08 發送簡訊給我 |
sBuf:=LowerCase(Trim(sBuf));
if sBuf='' then
exit; 這個sBuf有何用途呢?
還是你是要寫成 procedure TInternetDM.IdTelnet1DataAvailable(Sender: TIdTelnet;
const Buffer: String);
var
i: Integer;
sBuf: String;
begin
sBuf:=LowerCase(Trim(Buffer)); ---->
if sBuf='' then
exit;
for i:=1 to Length(TelnetPrompt) do
if Pos(TelnetPrompt[i], sBuf)>0 then ---->
begin
TelnetFlag:=True;
break;
end;
end;
|
JammyHsu
一般會員 發表:14 回覆:39 積分:10 註冊:2003-09-08 發送簡訊給我 |
引言: sBuf:=LowerCase(Trim(sBuf)); if sBuf='' then exit; 這個sBuf有何用途呢? 還是你是要寫成 procedure TInternetDM.IdTelnet1DataAvailable(Sender: TIdTelnet; const Buffer: String); var i: Integer; sBuf: String; begin sBuf:=LowerCase(Trim(Buffer)); ----> if sBuf='' then exit; for i:=1 to Length(TelnetPrompt) do if Pos(TelnetPrompt[i], sBuf)>0 then ----> begin TelnetFlag:=True; break; end; end;哦, sorry! 因為前面幾行是直接用打的, 不是從程式上copy的 原本就是如同---->處的寫法, 將Buffer改成sBuf Development Expert Legend Philosopher Human Intelligent |
zycagod
一般會員 發表:0 回覆:14 積分:12 註冊:2002-07-08 發送簡訊給我 |
|
JammyHsu
一般會員 發表:14 回覆:39 積分:10 註冊:2003-09-08 發送簡訊給我 |
引言: ==================================== SendCh(CmdStr[j]); 每送一個字元後等1秒到兩秒 如果這樣可以的話,那就是你也要比Echo. 至少電腦key字比手動Key字還快.呃......不太懂你的意思 (所有要sendch的內容都已建立) 沒有加入HandleMessage時 connect後本來應該要出現login:然後才SendCh, 可是沒有 所以我加入一個10秒等待echo迴圈, 如果沒有迴圈, 所有的訊息會一次送完 但是呢, 只有processmessages時, 結果都卡在迴圈裡 等到了10秒之後中斷, 秀出中斷訊息(ShowMessage) 結果竟然收到echo了(OnDataAvailable) 我很苦惱的是, 我要讓回應的訊息有其中幾個狀態(login, password, @mail)(帳號, 密碼, 提示字) 才送出命令 但是又不能讓程式停頓 後來我在想, 是不是因為原本idtelnet放在mainform裡 所以有mainform有收到訊息, 也正常啟動mainform.ondataavailable 搬到dll裡 反而不能正常觸發tinternetdm.ondataavailable 那如果我找一個可以trigger mainform, 是不是就可以了呢? 加入HandleMessage才有改善 這樣有了嗎? 我說得混亂 大家聽得模糊 仍感謝大家的提示解惑 *********************** 跟寫程式一樣,想不出來! |
JammyHsu
一般會員 發表:14 回覆:39 積分:10 註冊:2003-09-08 發送簡訊給我 |
既然有了開頭, 就再研究下去
加入Application.HandleMessage後, 只要移動滑鼠就可以trigger
所以Application.ProcessMessages可以移除
如下篇文章有過討論
http://delphi.ktop.com.tw/topic.php?topic_id=21123
那如果不移動滑鼠, 加入一個Timer固定時間自動
SendMessage(Application.Handle, 0, 0, 0);
也可以
言而總之
只有Application.ProcessMessages並不能解決我的問題
ProcessMessages加Timer並沒有用, 移動滑鼠也沒用
HandleMessage加Timer自動, 移動滑鼠算手動
就醬子 ***********************
跟寫程式一樣,想不出來!
|
Henrycs0421
一般會員 發表:1 回覆:1 積分:0 註冊:2005-07-24 發送簡訊給我 |
|
JammyHsu
一般會員 發表:14 回覆:39 積分:10 註冊:2003-09-08 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |