IOleClientSite
COM公式ドキュメント
埋め込みオブジェクトが、その表示サイト(display site)の位置や範囲、モニカー、ユーザーインターフェース、およびコンテナーが提供するその他のリソースに関する情報を取得するための主要な手段を提供します。
メソッド 6
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
クライアントサイトに関連付けられた埋め込みオブジェクトを保存します。この関数は同期的で、戻った時点で保存は完了しています。
戻り値
解説(Remarks)
埋め込みオブジェクトは、エンドユーザーが「ファイルの更新」または「終了」コマンドを選択したときに、自身を永続的なストレージへ保存するようコンテナーに要求するために SaveObject を呼び出します。この呼び出しは同期的であり、戻った時点で保存操作は完了しています。
SaveObject の呼び出しは、IOleObject::Close のほとんどの実装で発生します。通常、コンテナーがオブジェクトに閉じるよう指示するとき、コンテナーは、閉じる前にオブジェクトが自身を保存すべきか、ユーザーに指示を求めるべきか、または保存せずに閉じるべきかを指定するフラグを渡します。オブジェクトが、コンテナーまたはエンドユーザーから自身を保存するよう指示された場合、そのオブジェクトは SaveObject を呼び出して、閉じる前にオブジェクトの内容を保存するようコンテナーアプリケーションに要求します。コンテナーがオブジェクトに自身を保存しないよう指示した場合、オブジェクトは SaveObject を呼び出してはなりません。
オブジェクトのクライアントサイトのモニカーを取得します。オブジェクトは dwAssign に値を指定することで、自身または自身のコンテナーのモニカーの割り当てを強制できます。
| dwAssign | DWORD | in | モニカーが既に存在する場合にのみ取得するか、モニカーの割り当てを強制するか、一時的なモニカーを作成するか、または既に割り当てられているモニカーを削除するかを指定します。実際には、通常はコンテナーにモニカーの割り当てを強制するよう要求します。指定可能な値は OLEGETMONIKER 列挙型から取得されます。 |
| dwWhichMoniker | DWORD | in | コンテナーのモニカー、コンテナーに対するオブジェクトの相対モニカー、またはオブジェクトの完全なモニカーのいずれを返すかを指定します。実際には、通常はオブジェクトの完全なモニカーを要求します。指定可能な値は OLEWHICHMK 列挙型から取得されます。 |
| ppmk | IMoniker** | out | オブジェクトのクライアントサイトのモニカーへのインターフェイスポインターを受け取る IMoniker ポインター変数へのポインターです。エラーが発生した場合、実装は ppmk を NULL に設定しなければなりません。コンテナーは IOleClientSite::GetMoniker の呼び出しを受け取るたびに、返す ppmk ポインターの参照カウントを増やさなければなりません。ポインターの使用が終わったら Release を呼び出すのは呼び出し側の責任です。 |
戻り値
このメソッドは成功時に S_OK を返します。その他に返される可能性のある値は次のとおりです。
| Return code | Description |
|---|---|
| このコンテナーはオブジェクトにモニカーを割り当てることができません。OLE 1 コンテナーがこれに該当します。 |
解説(Remarks)
コンテナーは、埋め込みオブジェクトへのリンクを必要とするクライアントに対して、それらのオブジェクトのモニカーを渡す手段として GetMoniker を実装します。
埋め込みオブジェクト、またはその中の疑似オブジェクト(たとえばスプレッドシート内のセル範囲)へのリンクが作成されるとき、オブジェクトはリンクのソースを示す複合モニカーを構築するためにモニカーを必要とします。埋め込みオブジェクトがまだモニカーを持っていない場合、GetMoniker を呼び出してモニカーを要求できます。
埋め込みオブジェクトへのリンクを保持することを想定しているすべてのコンテナーは、OLEWHICHMK_CONTAINER を渡す GetMoniker をサポートすべきです。これにより、リンククライアントとリンクソースのファイルが移動しても相対的な位置が維持されている場合に、リンク追跡が可能になります。
オブジェクトは、自身の完全なモニカーやコンテナーのモニカーを永続的に格納してはなりません。これらはオブジェクトが読み込まれていない間に変わる可能性があるためです。たとえば、コンテナーまたはオブジェクトのいずれかが名前変更される可能性があり、その場合、コンテナーのモニカーやオブジェクトの完全なモニカーを格納していると、クライアントがオブジェクトへのリンクを追跡できなくなります。
ごく特殊なケースでは、オブジェクトが以前に割り当てられたモニカーを必要としなくなり、最適化のためにそれを削除したい場合があります。そのような場合、オブジェクトは OLEGETMONIKER_UNASSIGN を指定して GetMoniker を呼び出し、モニカーを削除できます。
オブジェクトのコンテナーへのポインターを取得します。
| ppContainer | IOleContainer** | out | コンテナーオブジェクトへのインターフェイスポインターを受け取る IOleContainer ポインター変数のアドレスです。エラーが発生した場合、実装は ppContainer を NULL に設定しなければなりません。 |
戻り値
このメソッドは成功時に S_OK を返します。その他に返される可能性のある値は次のとおりです。
| Return code | Description |
|---|---|
|
クライアントサイトが OLE 1 コンテナー内にあります。 |
| コンテナーが IOleContainer インターフェイスを実装していません。 |
解説(Remarks)
コンテナーが埋め込みオブジェクトへのリンクをサポートしている場合、GetContainer を実装すると、リンククライアントがコンテナーのオブジェクトを列挙し、包含階層を再帰的にたどることができるようになります。このメソッドは任意ですが、埋め込みオブジェクトへのリンクをサポートすることを想定しているすべてのコンテナーで実装することが推奨されます。
リンククライアントは、GetContainer を再帰的に呼び出してリンクソースのコンテナーへのポインターを取得し、続いて QueryInterface でコンテナーの IOleObject インターフェイスへのポインターを取得し、最後に IOleObject::GetClientSite でコンテナーのそのコンテナー内におけるクライアントサイトを取得することによって、複合ドキュメントオブジェクトの階層をたどることができます。
埋め込みオブジェクトへのリンクをサポートしない単純なコンテナーは、おそらくこのメソッドを実装する必要はありません。その代わり、E_NOINTERFACE を返し、ppContainer を NULL に設定できます。
コンテナーに対して、そのオブジェクトをユーザーに表示するよう要求します。このメソッドは、コンテナー自体が可視で最小化されていないことを保証します。
戻り値
このメソッドは成功時に S_OK を返します。その他に返される可能性のある値は次のとおりです。
| Return code | Description |
|---|---|
|
クライアントサイトが OLE 1 コンテナー内にあります。 |
解説(Remarks)
リンククライアントは、リンクソースにバインドした後、通常はリンクソースに対して IOleObject::DoVerb を呼び出します。これは通常、ソースに対して自身をユーザーに表示することを要する何らかの動作を実行するよう要求するものです。IOleObject::DoVerb の実装の一部として、リンクソースは ShowObject を呼び出すことができ、これによりクライアントは可能な限りリンクソースを表示するよう強制されます。リンクソースのコンテナー自体が埋め込みオブジェクトである場合、そのコンテナーは自身のコンテナーに対して ShowObject を再帰的に呼び出します。
ShowObject メソッドを呼び出したとしても、呼び出し時にコンテナーが表示できない可能性があるため、リンクソースが適切に表示される保証はありません。ShowObject メソッドは可視性を保証するものではなく、コンテナーが可能な限りの対応を行うことのみを保証します。
埋め込みオブジェクトのウィンドウが可視または不可視になろうとしているときに、コンテナーに通知します。このメソッドは、インプレースでアクティブ化され、そのためコンテナーとは別のウィンドウを持たないオブジェクトには適用されません。
| fShow | BOOL | in | オブジェクトのウィンドウが開いている(TRUE)か閉じている(FALSE)かを示します。 |
戻り値
このメソッドは成功時に S_OK を返します。
解説(Remarks)
埋め込みオブジェクトは、オブジェクトがウィンドウ内で開いているときにコンテナーに情報を伝え続けるために OnShowWindow を呼び出します。このウィンドウは、現時点でエンドユーザーに表示されている場合もあれば、そうでない場合もあります。コンテナーはこの情報を使用して、オブジェクトがウィンドウ内に表示されているときにオブジェクトのクライアントサイトに網掛けを施し、オブジェクトが表示されていないときに網掛けを解除します。この通知を受け取った網掛けされたオブジェクトは、既に開いているウィンドウを持っていることを認識しており、そのためダブルクリックされたときに、新しいウィンドウを取得するためにアプリケーションを起動する代わりに、このウィンドウをすばやく前面に表示することで応答できます。
コンテナーに対して、埋め込みオブジェクトの表示サイトのサイズ変更を要求します。
戻り値
このメソッドは成功時に S_OK を返します。その他に返される可能性のある値は次のとおりです。
| Return code | Description |
|---|---|
| クライアントサイトが新しいレイアウトの要求をサポートしていません。 |
解説(Remarks)
このメソッドは、領域を拡大することも縮小することもできます。現在のところ、オブジェクトがどれだけの領域を必要とするかをコンテナーが調整するための標準的なメカニズムは存在しません。そのような調整が定義された場合、このメソッドへの応答はコンテナーにとって任意となります。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IOleClientSite "{00000118-0000-0000-C000-000000000046}"
#usecom global IOleClientSite IID_IOleClientSite "{}"
#comfunc global IOleClientSite_SaveObject 3
#comfunc global IOleClientSite_GetMoniker 4 int,int,sptr
#comfunc global IOleClientSite_GetContainer 5 sptr
#comfunc global IOleClientSite_ShowObject 6
#comfunc global IOleClientSite_OnShowWindow 7 int
#comfunc global IOleClientSite_RequestNewObjectLayout 8
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。
; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。