Share via


IMoniker インターフェイス (objidl.h)

COM オブジェクトを一意に識別する情報を含むモニカー オブジェクトを使用できます。 モニカー オブジェクトの IMoniker インターフェイスへのポインターを持つオブジェクトは、オブジェクトが実際に分散システムに配置されている場所に関する他の特定の情報を持たずに、識別されたオブジェクトを検索、アクティブ化、およびアクセスできます。

モニカーは、COM でのリンクの基礎として使用されます。 リンク オブジェクトには、そのソースを識別するモニカーが含まれています。 ユーザーがリンクされたオブジェクトをアクティブにして編集すると、モニカーがバインドされます。これにより、リンク ソースがメモリに読み込まれます。

継承

IMoniker インターフェイスは IPersistStream から継承されます。 IMoniker には、次の種類のメンバーもあります。

メソッド

IMoniker インターフェイスには、これらのメソッドがあります。

 
IMoniker::BindToObject

指定したオブジェクトにバインドします。 バインディング プロセスでは、オブジェクトを見つけ、必要に応じて実行中の状態にし、識別されたオブジェクト上の指定されたインターフェイスへのポインターを呼び出し元に提供します。
IMoniker::BindToStorage

指定したオブジェクトのストレージにバインドします。 IMoniker::BindToObject メソッドとは異なり、このメソッドはモニカーによって識別されるオブジェクトをアクティブ化しません。
IMoniker::CommonPrefixWith

このモニカーが指定したモニカーと共通するプレフィックスに基づいて、新しいモニカーを作成します。
IMoniker::ComposeWith

現在のモニカーと指定したモニカーを組み合わせて、新しい複合モニカーを作成します。
IMoniker::Enum

複合モニカーのコンポーネントの列挙子へのポインターを取得します。
IMoniker::GetDisplayName

モニカーの表示名を取得します。
IMoniker::GetTimeOfLastChange

このモニカーによって識別されたオブジェクトが最後に変更された時刻を取得します。
IMoniker::Hash

モニカーの内部状態を使用してハッシュ値を作成します。
IMoniker::Inverse

このモニカーの逆であるモニカーを作成します。 このモニカーまたは同様の構造の 1 つの右側に構成されている場合、モニカーは何も作成しません。
IMoniker::IsEqual

このモニカーが指定したモニカーと同じかどうかを判断します。
IMoniker::IsRunning

このモニカーによって識別されたオブジェクトが現在読み込まれ、実行されているかどうかを判断します。
IMoniker::IsSystemMoniker

このモニカーがシステム提供のモニカー クラスの 1 つであるかどうかを判断します。
IMoniker::P arseDisplayName

表示名をモニカーに変換します。
IMoniker::Reduce

モニカーを最も単純な形式に減らします。
IMoniker::RelativePathTo

このモニカーと指定したモニカーの間に相対モニカーを作成します。

注釈

モニカーには、ファイル システム内のファイルへのパスと同様に、COM オブジェクトを見つけてアクティブ化できるようにする情報が含まれています。 モニカーは、ファイルに格納されているドキュメント オブジェクトから、埋め込みオブジェクト内の選択範囲まで、あらゆる種類の COM オブジェクトを識別できます。 COM には、システムで最も一般的に見られるオブジェクトを識別するモニカー オブジェクトを作成できるモニカー クラスのセットが用意されています。 たとえば、スプレッドシート内のセル範囲を表すオブジェクトがあり、それ自体がファイルに格納されているテキスト ドキュメントに埋め込まれている場合があります。 分散システムでは、このオブジェクトのモニカーは、オブジェクトのシステムの場所、そのシステム上のファイルの物理的な場所、そのファイル内の埋め込みオブジェクトのストレージ、最後に埋め込みオブジェクト内のセル範囲の場所を識別します。

モニカー オブジェクトは、IPersistStream インターフェイスから派生し、システム内の 1 つのオブジェクトを一意に識別する IMoniker インターフェイスをサポートします。 モニカーを提供するオブジェクトがモニカー オブジェクトを作成した後、そのオブジェクト内でこの情報を変更することはできません。 モニカー プロバイダーが情報を変更する場合は、新しいモニカー オブジェクトを作成することによってのみ行うことができます。これにより、該当するオブジェクトが一意に識別されます。

モニカーには、次の 2 つの重要な機能があります。

  • モニカーは永続ストレージに保存できます。 モニカーをメモリに読み込み戻しても、同じオブジェクトが識別されます。
  • モニカーは binding と呼ばれる操作をサポートしています。これは、モニカーによって名前付けされたオブジェクトを検索し、アクティブになっていない場合はそれをアクティブにし (メモリに読み込む)、そのオブジェクトの要求されたインターフェイスへのポインターを返すプロセスです。

アンチモニカーの実装

アンチモニカーは、ファイル、項目、およびポインター モニカーの COM 実装の逆です。 つまり、ファイル モニカー、アイテム モニカー、またはポインター モニカーの右側に構成されるアンチモニカーは、何も作成しません。

モニカー クライアントの場合は、通常、アンチモニカーを使用する必要はありません。 モニカーの逆関数が必要な場合は、 IMoniker::Inverse を呼び出す必要があります。 たとえば、複合モニカーの最後の部分を削除するために逆関数が必要な場合は、 IMoniker::Enum を使用してモニカーの部分を列挙し、右端の部分で 関数を呼び出します。 この目的にはアンチモニカーを使用しないでください。これは、複合の最も適切な部分が反モニカーを逆と見なしていることを確認できないためです。

アンチモニカーを明示的に使用する必要がある唯一の状況は、新しいモニカー クラスを記述していて、モニカーに逆関数を構築するための特別な要件がない場合です。 その場合は、 関数の実装からアンチモニカーを返すことができます。 IMoniker::ComposeWith の実装では、発生したすべての反モニカーに対してモニカーの 1 つを全滅させる必要があります。

CreateAntiMoniker 関数を使用して、これらのモニカーを作成します。

クラス モニカーの実装

クラス モニカーは、オブジェクト クラスを表すモニカーです。 クラス モニカーは、作成対象のクラスのクラス オブジェクトにバインドされます。

クラス モニカーは、ファイル モニカーやアイテム モニカーなどの他の種類のモニカーとの合成に最も役立ちます。 クラス モニカーは、 IClassActivator インターフェイスへのバインドをサポートするモニカーの右側にも構成できます。 これにより、 IClassActivator は、 クラスのクラス オブジェクトとインスタンスへのアクセスを提供できます。

クラス モニカーを使用するには、 CreateClassMoniker 関数を使用してこれらのモニカーを作成する必要があります。

ファイル モニカーの実装

ファイル モニカーは、ファイル システム内のパスを表すモニカーです。ファイル モニカーは、独自のファイルに保存されている任意のオブジェクトを識別できます。 ファイル内に含まれるオブジェクトを識別するために、ファイル モニカーの右側にある他のクラス (アイテム モニカーなど) のモニカーを作成できます。 ただし、複合内のファイル モニカーの左側にあるモニカーは、別のファイル モニカー、アンチ モニカー、またはクラス モニカーである必要があります。 たとえば、複合内のファイル モニカーの左側にアイテム モニカーが表示される場合は無効です。

アンチモニカーは、モニカーが表すパスのコンポーネントの逆ではなく、ファイル モニカー全体の逆であることに注意してください。つまり、ファイル モニカーの右側にアンチモニカーを作成すると、ファイル モニカー全体が削除されます。 ファイル モニカーによって表されるパスの右端のコンポーネントのみを削除する場合は、".." パスに基づいて別のファイル モニカーを作成し、ファイル モニカーの末尾まで作成する必要があります。

モニカー クライアント (モニカーを使用してオブジェクトへのインターフェイス ポインターを取得する) は、通常、モニカーのクラスを認識する必要はありません。 IMoniker インターフェイス ポインターを使用してメソッドを呼び出すだけです。

モニカー プロバイダー (モニカー クライアントがアクセスできるようにオブジェクトを識別するモニカーを渡す) は、識別するオブジェクトがファイルに格納されている場合は、ファイル モニカーを使用する必要があります。 各オブジェクトが独自のファイルに存在する場合、必要な型はファイル モニカーだけです。 識別されたオブジェクトがファイルよりも小さい場合は、ファイル モニカーに加えて別の種類のモニカー (アイテム モニカーなど) を使用する必要があります。

ファイル モニカーを使用するには、 CreateFileMoniker 関数を使用してモニカーを作成する必要があります。 ファイル モニカーがバインドされたときにオブジェクトを読み込むには、オブジェクトで IPersistFile インターフェイスを実装する必要があります。

モニカー プロバイダーの最も一般的な例は、リンクをサポートする COM サーバー アプリケーションです。 COM サーバー アプリケーションがファイル ベースのドキュメントへのリンクのみを完全にサポートしている場合、必要なモニカーの種類はファイル モニカーだけです。 COM サーバー アプリケーションで、ドキュメントよりも小さいオブジェクト (ドキュメントのセクションや埋め込みオブジェクトなど) へのリンクがサポートされている場合は、アイテム モニカーとファイル モニカーを使用する必要があります。

汎用複合モニカーの実装

ジェネリック複合モニカーは、コンポーネントが相互に特別な知識を持たない複合モニカーです。

コンポジションは、2つのモニカーを一緒に結合するプロセスです。 場合によっては、特定のクラスの2つのモニカーを特別な方法で組み合わせることができます。たとえば、不完全なパスを表すファイル モニカーと、相対パスを表す別のファイル モニカーを組み合わせて、完全なパスを表す単一のファイル モニカーを形成できます。 これは非ジェネリックコンポジションの例です。 一方、ジェネリックコンポジションは、クラスに関係なく、任意の2つのモニカーを接続できます。 非ジェネリックコンポジションは関係するモニカーのクラスに依存するため、 IMoniker::ComposeWith メソッドの特定のクラスの実装によってのみ実行できます。 新しいモニカー クラスを記述する場合は、新しい種類の非ジェネリックコンポジションを定義できます。 これに対し、汎用コンポジションは CreateGenericComposite 関数によって実行されます。

モニカー クライアント (モニカーを使用してオブジェクトへのインターフェイス ポインターを取得する) は、通常、モニカーのクラス、または汎用複合または非ジェネリック複合のいずれであるかを知る必要はありません。 IMoniker インターフェイス ポインターを使用してメソッドを呼び出すだけです。

モニカー プロバイダー (モニカー クライアントがアクセスできるようにオブジェクトを識別するモニカーを配布する) は、2 つのモニカーを一緒に作成する必要がある場合があります。 (たとえば、アイテム モニカーを使用してオブジェクトを識別する場合は、オブジェクトを渡す前に、そのオブジェクトのコンテナーを識別するモニカーを使用して作成する必要があります)。 IMoniker::ComposeWith メソッドを使用してこれを行い、最初のモニカーで メソッドを呼び出し、2 番目のモニカーをパラメーターとして渡します。このメソッドは、ジェネリックまたは非ジェネリック複合を生成できます。

ジェネリック複合モニカーを明示的に作成する必要があるのは、独自のモニカー クラスを作成する場合だけです。 IMoniker::ComposeWith の実装では、可能な限り非一般的なコンポジションを実行する必要があります。非ジェネリックコンポジションを実行できず、ジェネリックコンポジションが許容される場合は、CreateGenericComposite 関数を呼び出してジェネリック複合モニカーを作成できます。

アイテム モニカーの実装

アイテム モニカーは、コンテナー内のオブジェクト (ドキュメントの一部、複合ドキュメント内の埋め込みオブジェクト、スプレッドシート内のセルの範囲など) を識別するために使用されます。 アイテムモニカーは、多くの場合、ファイルモニカーと組み合わせて使用されます。ファイル モニカーはコンテナーを識別するために使用され、アイテム モニカーはコンテナー内の項目を識別するために使用されます。

アイテム モニカーにはテキスト文字列が含まれています。この文字列は、コンテナー オブジェクトによって、含まれている項目を他のアイテムと区別するために使用されます。 コンテナー オブジェクトは 、IOleItemContainer インターフェイスを実装する必要があります。このインターフェイスを使用すると、項目モニカー コードは、オブジェクトを識別する文字列のみを指定して、オブジェクトへのポインターを取得できます。

モニカー クライアント (モニカーを使用してオブジェクトへのインターフェイス ポインターを取得する) は、通常、モニカーのクラスを知る必要はありません。 IMoniker インターフェイス ポインターを使用してメソッドを呼び出すだけです。

特定されたオブジェクトが別のオブジェクトに含まれていて、文字列を使用して個別に識別できる場合、モニカー プロバイダー (モニカー クライアントがオブジェクトを識別するモニカーを渡してモニカーにアクセスできるようにする) は、アイテム モニカーを使用する必要があります。 コンテナー オブジェクトを識別するには、別の種類のモニカー (ファイル モニカーなど) を使用します。

アイテム モニカーを使用するには、 CreateItemMoniker 関数を使用してモニカーを作成する必要があります。 項目モニカーがバインドされたときにオブジェクトを読み込むには、オブジェクトのコンテナーで IOleItemContainer インターフェイスを実装する必要があります。

モニカー プロバイダーの最も一般的な例は、リンクをサポートする COM アプリケーションです。 COM アプリケーションでファイル ベースのドキュメントよりも小さいオブジェクトへのリンクがサポートされている場合は、アイテム モニカーを使用する必要があります。 文書内の選択範囲へのリンクを許可するサーバー アプリケーションの場合は、アイテム モニカーを使用してそれらのオブジェクトを識別します。 埋め込みオブジェクトへのリンクを許可するコンテナー アプリケーションの場合は、項目モニカーを使用して埋め込みオブジェクトを識別します。

OBJREF モニカーの実装

OBJREF モニカーは、ローカルまたはリモートのアウトプロセス サーバーで実行されているオブジェクト インスタンスへの参照を表します。 モニカーはオブジェクト インスタンスを識別し、オブジェクトが実行されているコンピューターを識別します。

OBJREF モニカーは、実行中のオブジェクトがアウトプロセスである点を除き、ポインター モニカーと多くの点で似ています。 クライアントは、OBJREF モニカーで IMoniker::BindToObject を呼び出し、取得したポインターを使用して、場所に関係なく実行中のオブジェクトにアクセスできます。

ポインター モニカーとの重要な違いは、OBJREF モニカーの表示名を HTML ページに埋め込み、モニカーで表される実行中のオブジェクトをクライアント スクリプト、アプレット、または ActiveX コントロールでバインドできることです。

OBJREF モニカーの主な用途は、インターネット経由で実行中のオブジェクト インスタンスへのアクセスを取得することです。 アクティブ・サーバー・ページまたは動的 HTML コンテンツを生成するその他の方法は、OBJREF モニカーの表示名をパラメーターにアプレットまたは ActiveX コントロールに配置します。 アプレットまたはコントロールのコードは 、CreateObjrefMoniker 関数を呼び出して、表示名に基づいて OBJREF モニカーを作成し、結果の OBJREF モニカーで IMoniker::BindToObject を呼び出して、実行中のオブジェクト インスタンスにアクセスします。 次に、アクティブなサーバー ページは、実行中のオブジェクトへのポインターをページのクライアントにマーシャリングします。

ポインター モニカーの実装

ポインター モニカーは基本的にインターフェイス ポインターをラップしてモニカーのように見え、モニカーを必要とするインターフェイスに渡すことができます。 ポインター モニカーのバインドは、ポインターの QueryInterface メソッドを呼び出すことによって行われます。

ポインター モニカーのインスタンスはシリアル化を拒否します。つまり、 IPersistStream::Save はエラーを返します。 ただし、これらのモニカーは RPC 呼び出しで別のプロセスにマーシャリングできます。内部的には、システムは、インターフェイス ポインターをマーシャリングするための標準パラダイムを使用して、ポインターをマーシャリングおよびアンマーシャリングします。

ポインター モニカーはほとんど必要ありません。 ポインター モニカーは、永続的な表現を持たないオブジェクトを特定するためにモニカーが必要な場合にのみ使用します。 ポインター モニカーを使用すると、このようなオブジェクトをモニカー バインド操作に参加できます。

URL モニカーの実装

IMoniker の URL モニカーの実装は、URL モニカー オブジェクトにあります。これは、IUnknownIAsyncMoniker インターフェイスもサポートしています。 IMoniker インターフェイスは IPersistStreamIUnknown から定義を継承し、IPersistStream はIPersist から継承します。 したがって、 IMoniker の実装には 、IPersistStream と IPersist のサポート 含まれています。

IAsyncMoniker インターフェイスは、単に IUnknown です。 (追加のメソッドはありません)。これは、モニカーが非同期バインディングをサポートしているかどうかをクライアントが判断できるようにするために使用されます。

このオブジェクトの IMoniker インターフェイスへのポインターを取得するには、 CreateURLMonikerEx 関数を呼び出します。

モニカー クライアント (モニカーを使用してオブジェクトへのインターフェイス ポインターを取得する) は、通常、使用しているモニカーのクラスを知る必要はありません。 IMoniker インターフェイス ポインターを使用してメソッドを呼び出すだけです。

モニカー プロバイダー (モニカー クライアントがオブジェクトにアクセスできるようにオブジェクトを識別するモニカーを配布する) では、識別するオブジェクトが別のオブジェクトに含まれていて、文字列を使用して個別に識別できる場合は、アイテム モニカーを使用する必要があります。 また、別の種類のモニカー (ファイル モニカーなど) を使用してコンテナー オブジェクトを識別する必要もあります。

アイテム モニカーを使用するには、 CreateItemMoniker 関数を使用してモニカーを作成する必要があります。 項目モニカーがバインドされたときにオブジェクトを読み込むには、オブジェクトのコンテナーで IOleItemContainer インターフェイスを実装する必要があります。

モニカー プロバイダーの最も一般的な例は、リンクをサポートする COM アプリケーションです。 COM アプリケーションでファイル ベースのドキュメントよりも小さいオブジェクトへのリンクがサポートされている場合は、アイテム モニカーを使用する必要があります。 文書内の選択範囲へのリンクを許可するサーバー アプリケーションの場合は、アイテム モニカーを使用してそれらのオブジェクトを識別します。 埋め込みオブジェクトへのリンクを許可するコンテナー アプリケーションの場合は、項目モニカーを使用して埋め込みオブジェクトを識別します。

要件

要件
サポートされている最小のクライアント Windows 2000 Professional [デスクトップ アプリ |UWP アプリ]
サポートされている最小のサーバー Windows 2000 Server [デスクトップ アプリ |UWP アプリ]
対象プラットフォーム Windows
ヘッダー objidl.h

こちらもご覧ください

CreateAntiMoniker

CreateClassMoniker

CreateFileMoniker

CreateGenericComposite

CreateItemMoniker

CreateObjrefMoniker

CreateURLMonikerEx

モニカー