環境
Delphi7
Windows7 64bit 32bit
プログラム起動時にIDとPASSを入力してログインする部分があるのですが
コンパイルしたexeからだと問題なく動作します。しかし、
DelphiIDE上でステップ実行すると以下のような現象が起こってしまいます。
データモジュール内にある
IdTCPClient1.Connect(5);
を実行した際に'Connect timed out.'のデバッガ例外ダイアログが出てしまう。
尚、iniファイルから値を読み取り
Host=127.0.0.1
Port=8901
としいる。
このため内部動作の調査が行えず困っているのですが
ステップ実行だと何故この様なエラーが起きるのでしょうか。
またこれを回避する方法はないでしょうか。
よろしくお願いします。
>IdTCPClient1.Connect(5);
5msec って気が短すぎませんか? 問題ないならいいですけど。
とりあえず
{$IFDEF DEBUG}
IdTCPClient1.Connect(2000);
{$ELSE}
IdTCPClient1.Connect(5);
{$ENDIF}
でどうでしょうか。
>Novさん
ありがとうございます。
2000で試したところ'refused'とエラー内容が変わっていました。
間違えて解決にチェックを入れてしまいました。
申し訳ありません。
>2000で試したところ'refused'とエラー内容が変わっていました。
それは、exeが問題無く動作しているのと同じ環境ですか。
(net設定とか火壁とか、いろいろありますので)
>>Novさん
同じPCで行っています。
Windows7 64bit、Delphi7で開発し、コンパイルしています。
コンパイルしたexeを起動するとID,PASS認証が通るのですが
内部処理を見るためにステップ実行で追っていくとエラーが出てしまいます。
ホスト側が拒否しているのは間違いないと思いますが、タイミング依存とは...う〜ん、さっぱりです。
exeだと問題なく通ってステップ実行だと通らないという点が謎です…
引き続き調査してみます。
デバッグ時に接続してる相手とexeを実行した時に接続してる相手は同じなのでしょうか?
出てるエラーから想像すると、exeで実行してる時は正規の相手に接続していてデバッグ時には別の相手に接続しようとしていて接続拒否されているように見えるんですけど。
MessageBoxか何かを使って、それぞれの時のHOSTとPORTを表示して確認とかしてみてはどうでしょう?
>auさん
IdTCPClient1.Connect(5);
行を実行すると、
C:\Program Files (x86)\Borland\Delphi7\Source\Indy\IdTCPClient.pas
内の
procedure TIdTCPClient.Connect(const ATimeout: Integer = IdTimeoutDefault);
に飛びます。
上記関数内の
IOHandler.ConnectClient(Host, Port, BoundIP, BoundPort, BoundPortMin, BoundPortMax, ATimeout);
行実行時にエラーが表示されるため、その直前で引数を全てshowmessageで表示させたところステップ実行、exe実行共に
Host:127.0.0.1
Port:8901
BoundIP:''
Boundport:0
BoundPortMin:0
BoundPortMax:0
ATimeOut:5
となっていました。
ステップ実行では一度目に上記場所を通った後timeoutが表示されました。
exe実行ではshowmessageが3回表示されたあとパス入力画面に行けました。
補足ですが、プログラムの流れは
ID入力→上記の.Connect→Pass入力
となっております。
>showmessageが3回表示されたあとパス入力画面に行けました。
最初のConnectがTCPClient、次のConnectがTCPServerとすると、3回目はなんでしょう?(怪しくないですか)
>Novさん
確認したところどうやら指紋認証機器を使ってPASS入力の代わりができる仕様になっているようなのですが、現在その機器はもう返したためないとのことです。
この機器がPCに接続されていないことが原因の可能性はありそうです。
しかしその場合でもexeとステップ実行で動作が違うというのが謎ですが…
デバッガのダイアログが出たときにそのまま継続して実行を続けたらパスワード入力画面が表示されたりしないでしょうか?
exeで実行してる時にもパスワード入力画面が出るまでに3回メッセージボックスが出てるという話なので、認証方法を変更しながら接続の試行を繰り返す構造になっているのかも知れません。
デバッグ時には、適切に例外処理がなされていてもとりあえず例外が発生した場合はIDEが補足してダイアログを表示するようになってた思いますので。
>auさん
まさしくその通りでした。
一定条件までは指紋認証を要求し、その条件からはずれた場合PASS入力画面を表示する構造となっていました。
DB接続の問題だとばかり思っており、Connectを通るときの条件をしっかりと確認していませんでした…
初歩的なミスでお時間とらせてしまって申し訳ありません。
ありがとうございました。
ツイート | ![]() |