COM オブジェクトは、COM 仕様を使用する再利用可能なソフトウェア コンポーネントである「コンポーネント オブジェクト モデル オブジェクト」を指します。COM 仕様を使用すると、COM オブジェクトが適切に動作し、アプリケーションに簡単に統合できます。 COM オブジェクトは通常、ダイナミック リンク ライブラリ (DLL) を使用して実装されます。通常の DLL と同様に、COM オブジェクトは、サポートされている操作を完了するためにユーザーのアプリケーションが呼び出すことができるいくつかのメソッドを公開します。
このチュートリアルの動作環境: Windows7 システム、JavaScript バージョン 1.8.5、Dell G3 コンピューター。
COM オブジェクトとは何ですか?
コンポーネント オブジェクト モデル (COM) オブジェクトは、COM 仕様を使用する再利用可能なソフトウェア コンポーネントです。 COM 仕様を使用すると、COM オブジェクトが適切に動作し、アプリケーションに簡単に統合できるようになります。実際、COM は基本的にブラック ボックスに相当し、アプリケーションに対して多くの作業を実行できます。
COM オブジェクトは通常、ダイナミック リンク ライブラリ (DLL) を使用して実装されます。通常の DLL と同様に、COM オブジェクトは、サポートされている操作を完了するためにアプリケーションが呼び出すことができるメソッドを公開します。アプリケーションと COM オブジェクト間の対話は、アプリケーションと C オブジェクト間の対話に似ていますが、両者の間にはいくつかの大きな違いがあります。
COM オブジェクトは正確なカプセル化を実装します。単純にオブジェクトを作成して、そのパブリック メソッドを任意に呼び出すことはできません。 COM オブジェクトのパブリック メソッドは、1 つ以上のインターフェイス グループに配置されます。メソッドを使用するには、COM オブジェクトを作成し、COM オブジェクトから COM オブジェクトの適切なインターフェイスを取得する必要があります。例: IDirect3DCubeTexture8 インターフェイスには、キューブ フレーム リソースを処理できるメソッドが含まれています。このインターフェースに属さないメソッドにはアクセスできません。
COM オブジェクトの作成は、C オブジェクトの作成とは異なります。 COM オブジェクトを作成するにはいくつかの方法がありますが、いずれも COM 固有のテクノロジを必要とします。 Microsoft の DirectX アプリケーション プログラミング インターフェイス (API) には、ほとんどの DirectX オブジェクトを作成するためのさまざまなヘルパー関数とメソッドが含まれています。
COM オブジェクトの有効期間を制御するには、COM 固有の手法を使用する必要があります。
COM オブジェクトを明示的にロードする必要はありません。 COM オブジェクトは DLL に含まれています。ただし、この COM オブジェクトを使用する場合、DLL を明示的にロードしたり、静的ライブラリを明示的にロードしたりする必要はありません。各 COM オブジェクトには、オブジェクトの作成に使用される一意の登録 ID があります。COM は正しい DLL を自動的にロードします。
COM はバイナリ仕様です。 COM オブジェクトは、さまざまな言語で書き込んだり、さまざまな言語からアクセスしたりできます。 COM オブジェクトのソース コードについて何も知る必要はありません。例: Microsoft Visual Bisice アプリケーションは、日常的に COM オブジェクトを使用して C を作成します。オブジェクトとインターフェイスの違いを理解することが重要です。場合によっては、オブジェクトの名前がプライマリ インターフェイスの名前として参照されることがあります。ただし、厳密に言えば、これら 2 つの条件は互換性がありません。
▲COM オブジェクトは、任意の数のインターフェイスを公開できます。たとえば、すべての COM オブジェクトは IUnknown インターフェイスを公開する必要があり、通常、少なくとも 1 つの追加インターフェイス、場合によってはそれ以上の追加インターフェイスを公開します。これらの特別なメソッドを使用するには、COM オブジェクトを作成するだけでなく、正しいインターフェイス ポインターを取得する必要があります。 ▲多くのオブジェクトが同じインターフェイスを公開する場合があります。インターフェイスは、指定された操作を実行するメソッドのセットです。インターフェイスの定義では、メソッドの構文とその機能を指定します。特殊な操作をサポートする COM オブジェクトは、適切なインターフェイスを公開します。一部のインターフェイスは高度に特殊化されており、単一のオブジェクトによってのみ公開されます。他のほとんどの場合、複数のオブジェクトによって公開されます。非常に特殊なケースは、IUnknown インターフェイスがすべての COM オブジェクトによって公開される必要があることです。
インターフェイスには複数の世代があることがよくあります。多くの場合、それらの本質は同じですが、細部が異なります。通常、オブジェクトはインターフェイスの各世代を公開できます。これにより、古いプログラムはオブジェクトの古いインターフェイスを引き続き使用し、新しいプログラムは新しいインターフェイスの機能を利用できるようになります。通常、インターフェイス ファミリには同じ名前があり、その後に世代を示す整数が続きます。例: 元のインターフェイスの名前が IMyInterface の場合、次の 2 世代のインターフェイスの名前は IMyInterface2 および IMyInterface3 になります。整数には通常、directx のバージョン番号が使用されます。
GUIDS
Globally Unique Identifier (GUIDS) は、COM プログラム モデルの重要な部分です。最も基本的な原理では、GUIDS は 128 ビット構造です。ただし、GUIDS は、同一の GUIDS が 2 つ存在しないように作成されます。 COM は、次の 2 つの主な目的で GUIDS を広く使用します。
1. 特定の COM オブジェクトを一意に識別する。
2. 特定の COM インターフェイスを一意に識別するため。
戻り値 (HRESULT)
すべての COM メソッドは、HRESULT という名前の 32 ビット値を返します。ほとんどのメソッドでは、HRESULT は実際には 2 つの情報を含む構造体です。
1. このメソッドが成功するか失敗するか。
2. メソッドでサポートされている操作に関する詳細情報を出力します。
一部のメソッドによって返される HRESULT 値は Winerror.h で定義されています。メソッドによって返される HRESULT 値は、ユーザー固有の情報である場合もあります。これらの値は通常、メソッドのリファレンス ページで確認されます。
COM オブジェクトのメソッド呼び出しは、呼び出しの成功または失敗を示すさまざまなコードを返す可能性があるということは、戻り値のテストには細心の注意を払う必要があることを意味します。例: メソッド呼び出しの戻り値が
S_OK の場合、メソッド呼び出しが成功したことを示します。戻り値が S_FAIL の場合、呼び出しが失敗したことを示します。もちろん、メソッド呼び出しは他の値を返す場合もあります。通話の成功または失敗を示すコード。次のコード スニペットは、コードに対してこのような単純なテストを実行するのは安全ではないことを示しています。コード内の hr の値は、メソッド呼び出しの戻り値です。
if( hr == E_FAIL ) { //Handle the failure } else { //Handle the success }
このコードが E_FAIL のみを返す場合、このコード スニペットは正常に機能します。ただし、そうではありません。このメソッド呼び出しは、E_NOTIMPL、E_INVALIDARG などの他の値も返す場合があります。コードがこれらの値を返した場合、このコード セグメントはそれらの値を処理せず、デフォルトではプログラムが実行中であることを示します。通常通りですが、実際のプログラムは正しくありません。
メソッド呼び出しに関する詳細情報を知りたい場合は、関連する各戻り値をテストする必要があります。ただし、メソッド呼び出しが成功したかどうかだけを知りたい場合もあります。メソッド呼び出しが成功したかどうかをテストする良い方法は、winerror.h ファイルで定義されている次の 2 つのマクロにメソッドの戻り値を渡すことです。
1. マクロ SUCCEEDED は、呼び出しが成功したことを示す場合は TRUE を返し、呼び出しが失敗したことを示す場合は FALSE を返します。
2. マクロ FAILED は、呼び出しが失敗したことを示す場合は TRUE を返し、呼び出しが成功したことを示す場合は FALSE を返します。
FAILED マクロを使用して、前のコード セグメントを変更できます。
if( FAILED(hr) ) { //Handle the failure. } else { //Handle the success. }
上記のコード スニペットは、E_NOTIMPL エラーと E_INVALIDARG エラーを処理します。
ほとんどのメソッドの戻り値 HRESULT は構造体の値ですが、いくつかのメソッドの戻り値 HRESULT は単純な整数値です。これは、整数値を返すメソッドは常に正常に呼び出すことができることを意味します。このタイプの戻り値を SUCCESS マクロに渡すと、マクロは常に TRUE を返します。一般的な例は、IUnkoown::Release メソッドです。このメソッドの機能は、オブジェクトの使用数を解放 (デクリメント) し、オブジェクトの現在の使用数を返すことです。使用回数は、オブジェクトの存続期間を識別するために使用されます。
ポインターのアドレス
COM メソッドのリファレンス ページをいくつか見たことがある方は、次のような状況に遭遇したことがあるかもしれません。
HRESULT CreateDevice( . . . IDirect3DDevice8 **ppReturnedDeviceInterface )
一般に、C または C 開発者はポインターに精通しており、COM は通常、追加の間接標準を使用します。標準は、2 つのアスタリスク (**) の後に型指定と、典型的な「pp」プレフィックスが付いた変数名です。前の例では、ppReturnedDeviceInterface パラメーターは IDirect3DDevice8 インターフェイスへのポインターのアドレスです。
c とは異なり、COM オブジェクトのメソッドに直接アクセスすることはできないため、メソッドを公開するインターフェイスへのポインターを取得する必要があります。オブジェクト インターフェイスのメソッドを呼び出す構文は、ポインターを使用して C メソッドを呼び出す構文と同じです。たとえば、IMyTnterface::DoSomething メソッドを呼び出すには、次の構文を使用するだけです。
IMyInterfance *pMyTface; . . . pMyIface->DoSomething(...) ;
COM オブジェクト インターフェイスへのポインターの場合、インターフェイスへのポインターを直接作成することはできません。このポインターを取得するには、1 つ以上の他のメソッドを呼び出す必要があります。例: 前述の CreateDevice メソッド。
このメソッドを通じてインターフェイス ポインターを取得するには、要求したインターフェイスを指す変数を宣言する必要があります。この変数のアドレスを CreateDevice メソッドに渡します。つまり、変数のアドレスをこのメソッドに渡す必要があります。このメソッドが返されると、この変数は要求したインターフェイスを指すようになり、このポインターを通じてこのインターフェイスのメソッドにアクセスできるようになります。
プログラミング関連の知識について詳しくは、プログラミング ビデオをご覧ください。 !
以上がJavaScriptのCOMオブジェクトとは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。