2

COM インターフェイスでアクセスするサードパーティ ライブラリを試してみました。
いくつかのテストでは、メイン フォームを次のように作成しました。

TForm1 = class (TForm, IThirdParyCOMInterface)

TForm1 は IThirdParyCOMInterface のすべてのメソッドを実装しており、必要な機能が得られます。

次のステップは、この COM インターフェイスを処理するためだけに別のクラスを作成することです。
このようなことをする:

TMyClass = class (TInterfacedObject, IThirdParyCOMInterface)

コンパイラ エラーが発生します。

E2291 インターフェイス メソッド IDispatch.GetTypeInfoCount の実装があり
ません E2291インターフェイス メソッド IDispatch.GetTypeInfo の実装が
ありません E2291 インターフェイス メソッド IDispatch.GetIDsOfNames の実装がありません E2291 インターフェイス メソッド IDispatch.Invoke の
実装がありません

( IThirdPartyCOMInterface = interface (IDispatch) )
TForm は既にこれらの IDispatch メソッドを実装しているようですが、私の新しい単純なクラスは実装していません。

上記のような新しいクラスでこれを行うにはどうすればよいですか?
これらの IDispatch メソッドが既に実装されているようにするには、どのクラスから新しいクラスを継承する必要がありますか?

編集:
TAutoIntfObject を見つけました。それは私が必要なものですか?
(COM は私にとって少し混乱を招きます。ここでは推測しているだけです)

4

2 に答える 2

5

特にオートメーション サーバー (別名 DCOM サーバー) として機能する EXE プロセスを作成している場合、COM で行う従来の方法は、フォームから COM インターフェイスを分離することです。

通常の Delphi アプリケーションを作成していて、泥の巨大なボールになりたくない場合でも、これを行うのは伝統的です。ですから、FORM にディスパッチ インターフェイスを実装させたい理由を自問してください。簡単で汚いデモであ​​っても、COM Server クラスと Forms を混同することは、必要のない楽しいことです。

デュアル インターフェイス (オートメーション) オブジェクトは通常、独自のクラスとして構築され、フォームへの参照をプライベートに持つ場合があります。その方法で確認することをお勧めします。

IThirdPartyComInterface独自のクラスで実装するTThirdPartyComInterface必要があり、デュアル COM (ネイティブ vtable + Dispatch) オブジェクトである必要があります。

次に、COM サーバー オブジェクトを登録する必要があります。

さまざまなチュートリアルがありますが、最新のものはありません。これはDelphi 7用のものです。

おそらく最適な場所は、IDispatch を実装する TThirdPartyComInterface クラスとネイティブ VTable COM (より高いパフォーマンス) を一度に作成するために使用する Com オブジェクト ウィザードを表示する DocWiki ですIDispatch を TForm にハッキングすることもできますが、それを行うたびに、私の選択したサブ神またはアルコンが、私の選択した毛皮で覆われた小さな動物を処刑します。やらないでください。あなたが殺している小さな毛むくじゃらの動物のことを考えてみてください。

于 2012-06-10T02:50:26.187 に答える
2

TAutoObjectの代わりに使ってみてくださいTInterfacedObject。前者は実装IDispatchし、後者は実装するだけIUnknownです。(ComObjユニットに入っています)

于 2012-06-11T13:32:55.770 に答える