2012-02-11 14 views
0

comのドキュメントでは、すべての言語で文字通り動作すると言います。あなたはその言語のための特定のAPIを持つ必要がありますので、それはcomとのインターフェースが可能ですか、どんな言語でもそのまま使えますか?また、特別なコンパイラが必要ですか?申し訳ありませんが、これは愚かな質問ですが、私はそれを以前に使用したことがない、私はこの答えを見つけることを試みている。私がcomのデモを見ると、すべてがCスタイルの構文でオブジェクトにアクセスしているように見えますが、他の言語(文字通りすべて)のバインディングとapiはありますか?comオブジェクトを扱うには、API固有の開発者が必要ですか?

+0

ほとんどの努力は実際にランタイムサポートライブラリに入ります。実際にCOM呼び出しを行うコード。コンパイラは、言語構造からランタイムサポート関数呼び出しへのバインディングを生成するだけで済みます。 IDispatchは、スクリプト実行時に使用される最も一般的なインターフェイスです。非常にシンプルで、7つのメソッドしかありません。 Plus CoInitializeExとCoCreateInstanceについては、それについてです。 –

答えて

1

COMの重要な点は、それが「バイナリ標準」であることです。つまり、メモリのビットとバイトが正しい場所にある限り、使用する言語は気にしません。

COMは基本的にすべてのCOMオブジェクトにメモリ内の特定のレイアウトが必要であることを指定しています。インターフェイスポインタはポインタを指します。ポインタは少なくとも3つのメンバを持つポインタを指します。 IUnknown関数(AddRef、Release、QueryInterface)へのポインタ、および残りはインタフェース内の他の関数へのポインタです。 COMは、引数がこれらの関数にどのように渡されるかを指定します。呼び出し元と呼び出し先がスタックの使用方法とその値をポップする方法に同意するようにします。

この要件は、C++がWindows上でどのように動作するかとうまく一致します。したがって、IUnknownを実装するほとんどのC++クラスは、有効なCOMクラスとして終了します。これは、MicrosoftのC++実装では、COMに必要なオブジェクトレイアウトを使用するためです.C++オブジェクトのvtableポインタはCOMポインタと同じです関数ポインタのC++テーブルは、COMがその関数テーブルポインタのために必要とするものであり、以下同様である。 COMは、MSのコンパイラが使用する技術であるC++オブジェクトがメモリに実装される最も一般的な方法を利用するように設計されている可能性があります。任意の特定のオブジェクトのレイアウト - だから、COMで使用できないクラスを提供する方法でC++を実装したサードパーティのC++コンパイラを使用することもできますが、壊れているように見えるので、 )

プレーンCでは、適切な構造体を含むポインタを手動で作成してCOMオブジェクトを作成できます。これは、Cが本質的に構造体のバイナリレベルのメモリレイアウトを手動で指定できるようにするためです。 COMが期待している適切なレイアウトを持つことがわかっている構造体を作成することができます。

他の言語、特にユーザーが明示的にメモリレイアウトを指定できない言語では、COMサポートを可能にする言語からのサポートが必要です。すべての.Net言語 - C#、VB.Netなど - .COMランタイムでサポートされているものを使用し、COMが期待するものを理解し、相互運用を可能にするために必要な適切なラッパーを生成します。

短い話ですが、太陽の下の言語は自動的にCOMで動作するわけではありません。実際には、C言語とC++言語の2つの言語が既にCOMの要件に対応しているケースがあります。他の多くの言語ではコンパイラのサポートが必要になります。

関連する問題