6

COM のデュアル インターフェイスは、DispInterface または VTable メソッドを介してアクセスできるインターフェイスです。

2つの方法の違いは何ですか?

VTable は、子クラスでオーバーライドできる仮想関数を持つクラス階層を実装するときに、さまざまな関数へのポインターを保持する仮想テーブルであると考えました。しかし、これが COM のデュアル インターフェイスとどのように関連しているのかわかりません。

4

3 に答える 3

3

追加の Tony の質問に対する回答のみが必要です。

VBScript/JScript または古い「クラシック」ASP からアクセスできる COM を作成する場合は、IDispatch を実装する必要があります。

Visual Basic 6 または MS Office の VBA では、両方の方法を使用できます。COM に参照を追加すると、「アーリー バインド」(IUnknown または VTable) が使用されます。CreateObject ("ProgIdName") を使用して VB6 または VBA で COM を使用する場合、「遅延バインド」が使用されます。

VB6/VBA ect から COM にアクセスできるようにすることを理解することは非常に重要です。IUnknown インターフェイスを実装するだけでは十分ではありません。タイプ ライブラリを作成し、oleautomation属性で登録する必要があります。これを可能にするために、oleautomation互換性のあるデータ型のみを COM のインターフェイスで使用できます ( http://msdn.microsoft.com/en-us/library/aa367129%28VS.85%29.aspxを参照)。)。タイプ ライブラリがクライアント マーシャリング DLL の役割を果たすことを理解するために、VB6/VBA などのクライアント ソフトウェアがデータをパラメータとして COM に正しく送信するのに役立ちます。COM が InProc サーバー、DLL であっても、パラメータは COM に直接転送されず、マーシャリングが必要であることを忘れないでください。マーシャリング中に、COM を実行するスレッド上にデータのコピーが作成されます。これにより、COM DLL スレッドが安全になり、COM が値を返す前に COM メソッドを呼び出すスレッドが終了しても、COM はクラッシュしません。

マーシャリングについての私の説明は簡単ではないかもしれませんが、タイプ ライブラリを作成して登録することを忘れないでください。COM 内のリソースとして保存することをお勧めします。

于 2010-05-15T01:40:37.410 に答える
3

主な違いは、オブジェクト メソッドの呼び出し方法にあります。DispInterface 呼び出しの場合は、IDispatch::Invoke メソッド (スクリプトで使用されるか、インターフェイスの説明がない場合に使用されます) を経由します。備考を参照してください。この方法は、2 番目のオプションよりもはるかに低速です。2 番目のケースでは、メソッド呼び出しに VTable を直接使用します (C++ または .NET 言語からの呼び出しに使用されます)。

于 2010-05-14T17:57:19.520 に答える
2

つまり、COM はバイナリ仕様であり、言語仕様ではありません。コード内のデュアル インターフェイスと派生クラスの間には、実際には相関関係はありません。リンゴとオレンジ。

VTable は「アーリー バインド」されているため、高速です。コンパイル時に呼び出すメソッドのタイプがわかっている。

DispInterface の使用は「レイト バウンド」であるため、速度は遅くなりますが、より柔軟になります。スクリプト作成に広く使用されています。メソッドとプロパティの型は実行時に決定されます。

この簡単な説明がお役に立てば幸いです。

于 2010-05-14T17:48:02.140 に答える