2

Delphi XE2 で 2 つの ActiveX コンポーネントを別々のプロジェクトで作成しました。コンポーネントの 1 つが完全に機能し、それがスローするすべての例外が EOleException としてマスクされます。他の activex コンポーネントでは、例外はマスクされず、元の型としてスローされます。クライアントは Delphi XE プログラムです。

activex コンポーネントが元の例外をスローすると、コンポーネントから他のメソッドへの次の呼び出しは、ローカル文字列変数に値を設定するなど、本来すべきではない場所でアクセス違反例外をスローします。これは非常に奇妙な動作です。

両方のプロジェクトの .ridl ファイル、コンパイル オプション、.dproj ファイルを比較しましたが、原因が見つかりませんでした。

この違い/奇妙な動作の理由を知っている人はいますか?

ありがとう

編集:いくつかのコード

機能するコンポーネント 1 (すべての例外を EOleException にマスクします)

TspdMyClassX = class(TActiveXComponent, MyInterface)

...

initialization


TActiveXComponentFactory.Create(
    ComServer,
    TspdMyClassX,
    CLASS_spdMyClassX,
    1,
    '',
    0,
    tmBoth);

EOleException をスローしない他のコンポーネントのインターフェースは異なりますが、コードの残りの部分は同じです (初期化、親クラス TActiveXComponent)。

4

1 に答える 1

1

問題は、delphi XE2 で生成された .ridl / .tlb ファイルにあるようです。Delphi 7 を使用してコンポーネントを再設計し、プロジェクトを Delphi xe2 で開き、コンパイル/ビルドのみを行いました (.ridl を編集せず、delphi xe2 で TLB を変更しません)。すべての例外は EOleException によって正しくマスクされ、問題は解決されました

于 2013-04-24T17:11:48.490 に答える