1

私はこの問題で提起されたものと非常によく似た問題を抱えています(SSL dll をロードする「問題」のため、最初のロードで 2 回接続する必要があります)。ただし、Indy の最新バージョンを使用していると確信しています。そこで提案された解決策は私の問題を解決しません。

私は Delphi7 を使用していますが、Delphi7 インストーラーから Indy をインストールしないことにしました。Indy10 (SVN ソースから) をダウンロードしてインストールする前に、最新の SVN ソースから Indy9 をインストールしましたが、Indy9 の代わりに新しい Indy10 コンポーネント/パスを使用するように IDE とプロジェクト設定を再構成しました。明らかに、プロジェクトはビルドに Indy10 を使用しています。コンパイルするためにすべての Indy10 シグネチャに一致させるために変更しなければならなかったメソッドがかなりあるからです。

Indy10 の私の SVN リポジトリはhttps://svn.atozed.com:444/svn/Indy10/trunk/Libからチェックアウトされ、約 2 週間前の 4972 の最後のコミット リビジョンを示しています。本当に古いバージョンの Indy10".

Win32 用の OpenSSL 1.0.1e をhttp://opendec.wordpress.com/のバイナリ ビルドからダウンロードし(前述の他のスタック オーバーフローの質問で推奨されている場所)、ビルドした .exe と同じフォルダーに配置しました。

SSL接続を開くために現在使用しているコードは次のとおりです。

  try
    POP.Connect(Server,Port,Protocol,UserName,Password,TimeOut);
  Except
    on e : EIdOSSLCouldNotLoadSSLLibrary do
    begin
      ShowMessage('Failed to load: ' + WhichFailedToLoad());
      POP.Connect(Server,Port,Protocol,UserName,Password,TimeOut);
    end;
  end;

しかし...これはEIdOSSLCouldNotLoadSSLLibrary例外を引き起こし、WhichFailedToLoadを追加するとまったく同じコンポーネントのリストが表示されます。これは、OpenSSLの「インディ固有」バージョンを期待していることを示唆しています:

読み込みに失敗しました

しかし、ちょっと待ってください... Remy は、リンクされた質問で、「Indy 10 が更新され、カスタムビルドの DLL が不要になりました。標準化された OpenSSL DLL をそのまま使用するようになりました」と答えました。では、Indy 固有の機能が必要であると不平を言うのはなぜでしょうか?

初めて接続に失敗した理由/必要ではないことを理解している機能が必要であると言っている理由をトラブルシューティングするにはどうすればよいですか? インディ固有の機能を探すべきではないという私の期待は間違っていますか?

4

1 に答える 1

1

質問へのコメントで確認された私の推測では、コンパイラはプロジェクトをビルドするために Indy 10 ではなく Indy 9 を見つけているということです。

IDE が設計時に 1 つのバージョンを使用し、コンパイラが別のバージョンを使用している可能性があるため、事態はさらに悪化する可能性があります。実際、IDE とコンパイラはチェーンの異なる部分であり、両者の間の元の同期を破ることができます。そのため、両方のケースについて説明しますが、後で説明するように、両方を変更する必要があります。

IDE と設計時間

設計時パッケージは IDE によってロードされ、作業中にオブジェクトを作成し、オブジェクト インスペクターでそのオブジェクトのプロパティを表示し、フォーム DFM ファイルを作成し、IDE に頼って生成するときに使用されるメソッドを確定します。イベントに応答するパスカル コード。

IDE の場合、画像に示すように、任意の Indy コンポーネントを右クリックして、設計時に使用しているバージョンを確認できます。

ここに画像の説明を入力

設計時に使用しているバージョンを変更するには、 に移動してComponent\Install packages、リストで正しいバージョンを確認します。Indy 9 と Indy 10 を同時にロードすることはできません。

コンパイラとランタイム

コンパイラは、ライブラリ パスを使用して、プロジェクト自体の一部ではないプロジェクトで使用するユニットを探し、そのコードをコンパイルして実行可能ファイルを生成します。

実行可能ファイルにリンクされた Indy のバージョンを確認するには、Versionすべての INdy コンポーネントに存在するプロパティに頼ることができます。次に例を示します。

ShowMessage('Indy version: ' + MyIndyComponent.Version);

コンパイラが最初に見つけたものを変更するには、パスを変更する必要があります。IDE 内から実行できます。Tools\Options\Delphi options\Library\Library path\最新の Delphi では、チェックインできますProject\Options\Delphi compiler\Search path\(オプションが D7 のどこにあったか覚えていません)。

インディ9/10事件

Indy は、Indy 10 を使用して Indy 9 用に作成されたプロジェクトをコンパイルすることを不可能にするインターフェイスの破壊的な変更を導入しました。たまたま異なるインターフェースを持っている場合は、マイナー バージョンにアップグレードするときにコードを変更してください。

そのため、コンパイル/実行時と IDE/設計時の両方で間違いなく Indy 9 を使用しているため、環境で両方を調整する必要があります。その後、調整のためにコードの一部を書き直す準備をしてください。何が変わったのかを理解し、適応する方法を学べば、変更は非常に簡単です。詳細はこの回答の範囲外ですが、インターネットには、その方法を理解するのに十分な情報があります。

于 2013-04-06T20:13:50.947 に答える