0

最近、古い Delphi 6 プロジェクトを Delphi 2007 にアップグレードする必要がありました。これは、Indy TidTCPServer コンポーネントを使用するサーバー アプリケーションです。Indy 10 へのアップグレードで見つけたすべての例に従いました。

アプリケーションは、TCP/IP を介して古い VB6 アプリケーション (コードがない) とインターフェイスします。VB6 アプリケーションが接続するとすぐに Indy コンポーネントの Execute イベントが発生するため、苦労していますが、データは書き込まれません。これにより、アプリケーションは、決して到着しないデータを送信するのを待機してハングします。

元のコードは次のようになります。


data := AContext.Connection.IOHandler.ReadLn;
if data <> '' then
  begin
    // do some stuff
  end;

私は Indy の例からいくつかのコード例を試しました。例は次のとおりです。

AContext.Connection.IOHandler.CheckForDataOnSource(10);
AContext.Connection.IOHandler.InputBufferIsEmpty でない場合
  始める
    データ:= AContext.Connection.IOHandler.ReadLn();
    データ <> '' の場合
      始める
        // 何かをする
      終わり;
  終わり;

不思議なことに、元のコードを .NET クライアントで実行すると、問題なく動作します。これは、VB6 アプリケーションに起因する問題のようです。

4

3 に答える 3

1

Indy 9 には Delphi 6 が付属しており、Indy 10 には Delphi 2007 が付属していると思われるため、問題は Indy 9 と Indy 10 の違いにあるようです。残念ながら、Indy 10 は常に後方互換性があるとは限りませんでした。

Indy 10 でのオブジェクト階層の変更

興味深いのは、Net クライアントが問題なく接続していると言うことです...おそらく、Delphi 2007 で再コンパイルされた変更されていないバージョンのサーバーと仮定しますか? もしそうなら、Delphi 6 システムを構築するために Indy 10 が既にインストールされているように思えます...

于 2009-06-23T03:30:34.737 に答える
1

問題が解決しました。次のコードは機能します...


AContext.Connection.IOHandler.CheckForDataOnSource(10);
  if not AContext.Connection.IOHandler.InputBufferIsEmpty then
    begin
      data := AContext.Connection.IOHandler.InputBuffer.Extract;

ストリームを綿密に調べた後 (@Roddy の提案に従って)、VB6 アプリケーションが接続で CRLF を送信していないことがわかりましAContext.Connection.IOHandler.ReadLn;た。

答えを見つけるのを手伝ってくれた@Darianと@Roddyに感謝します。

于 2009-06-24T15:27:26.857 に答える
1

WireSharkを起動して、実際に何が送受信されているかを確認するときが来たようです。それはあなたが必要とする手がかりを与えるかもしれません。

C++Builder2009 を使用して Indy 9 から Indy 10 にアップグレードする際に問題が発生しました。Indy 9 の TIdTcpClient "Connect" メソッドには、大まかに次のような宣言があります。

void Connect(int ConnectTimeout);

Indy10 では、「ConnectTimeout」がプロパティになり、Connect メソッドには次のような宣言が含まれるようになりました。

void Connect(String HostName);

したがって、「Connect(5000);」を使用した古いコード 正常にコンパイルされた (Int から String への自動変換演算子があるため) "5000" というホストに接続しようとしました....

于 2009-06-23T07:59:53.567 に答える