コードの概要
次の図は、ADSIサンプルプロバイダーコンポーネントを実装するために必要なコードブロックの概念を示しています。 各セクションについては、次の図で説明します。 経験豊富なCOMプログラマは、プロバイダーコンポーネントの例の概要に適していることがわかります。 詳細については、 「コードの詳細」 を参照してください。
次の番号付きの項目は、図のブロック要素に対応しています。
- DLLの読み込み(Libmain.cpp、Guid.cpp)。 DLLのエントリポイント。 2つのプロバイダーオブジェクトのクラスファクトリの静的オブジェクト定義。Guid.cppには、さまざまなサンプルプロバイダーコンポーネントオブジェクトの実装のCLSID定義が含まれています。
- プロバイダーオブジェクトクラスファクトリと作成コード(Cprovcf.cpp、Cprov.cpp、Stdfact.cpp)。 プロバイダーオブジェクトは、サンプルプロバイダーコンポーネントの検索とバインドで説明されているように、モニカーバインド操作中にIParseDisplayNameをサポートするオブジェクトです。
- オブジェクトへのバインド (Getobj.cpp) 。 このコードはパーサーを呼び出して、指定されたADsPathが構文的に正しいことを確認し、ADsPathからActive Directoryオブジェクトとして作成される項目のネイティブディレクトリサービスパスへの必要なマッピングを実行します。 この種類のオブジェクトのスキーマ定義を検索し、必須のプロパティを入力します。 Active Directoryオブジェクトを作成した後、IUnknownへのインターフェイスポインターが呼び出し元に対して取得されます。
- プロバイダー名前空間 (Parse.cpp) のパーサー。 これは、項目3によって呼び出されるコードです。 パーサーは、渡されたADsPath文字列が独自の名前空間に対して構文的に正しいことを確認します。
- 名前空間オブジェクトのクラスファクトリ、作成、および列挙(Cnamcf.cpp、Cnamesp.cpp、Cenumns.cpp)。 名前空間オブジェクトは、この名前空間のすべてのルートノードオブジェクトを検索するために列挙できるコンテナーオブジェクトです。
- 汎用Active Directoryオブジェクトのクラスファクトリと作成コード、および汎用ADコンテナーオブジェクトのクラスファクトリ、作成、および列挙コード(Cgenobj.cpp、Cenumobj.cpp、Common.cpp、Core.cpp)。 このコードは、Active Directoryオブジェクトが作成されるときに実行されます。
- バリアントのフィルター処理と列挙(Cenumvar.cpp、Object.cpp)。 1つの型のVARIANT要素のコレクションがADSI内で管理されている場合は、このコードが使用されます。
- グローバル (Globals.cpp) 。 名前空間キーワード、ネイティブデータ形式からADs Automation VARIANT型への構文マッピング構造は、すべてここで定義されます。
- データのマーシャリング/マーシャリング解除(Pack.cpp、Property.cpp、Smpoper.cpp)。 ネイティブデータ形式からサポートされている一連のAutomation VARIANT型への変換は、オブジェクトのプロパティがプロパティキャッシュに読み込まれるときに発生します。 ポインターを持つ構造体をメモリ内でコピー、削除、または移動するときは、データに対するその他の特別な処理を実行する必要があります。
- プロパティキャッシュ (Cprops.cpp) 。 プロパティのキャッシュは、ADSI環境の機能です。 IADs :: GetInfo、IADs :: GetInfoEx、およびIADs :: SetInfoメソッドは、プロパティキャッシュで動作します。
- メモリ管理 (Memory.cpp) 。 1セットのメモリ関数を使用してメモリを割り当てたり解放したりすると、プロバイダーコンポーネントの例でメモリの使用状況を追跡し、メモリリークを停止できます。
- スキーマオブジェクトと管理(Cschobj.cpp、Cprpoobj.cpp、Cclsoobj.cpp、Cenumsch.cpp)。 これには、スキーマオブジェクトを作成、管理、および列挙するルーチンが含まれます。 これには、スキーマクラスのコンテナーオブジェクトを列挙できるだけでなく、スキーマクラスオブジェクト、プロパティオブジェクト、および構文オブジェクトが含まれます。
- オペレーティングシステム固有の呼び出し (RegDSAPI.cpp) 。 これには、ネイティブオペレーティングシステムを参照するすべての呼び出しが含まれます。 その他の関数には、オブジェクトを開く、閉じる、読み取る、および変更する関数と、スキーマおよびプロパティデータにアクセスする関数が含まれます。 プロバイダーコンポーネントの例では、レジストリを使用してディレクトリ階層をシミュレートしています。 プロバイダーライターにとって重要なのは関数名だけです。
- IDispatch実装 (Cdispmgr.cpp) 。 このコードは、タイプライブラリデータにアクセスして、オートメーションと互換性のある方法でインターフェイスメソッドを呼び出すことができるようにします。