IOleUndoUnit
COM公式ドキュメント
アンドゥユニットの主要インターフェースとして機能します。アンドゥユニットは、単一のアクションをアンドゥまたはリドゥするために必要な情報をカプセル化します。
メソッド 4
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
アンドゥユニットに対して、その処理を実行するよう指示します。子アンドゥユニットを含む場合は、それらの Do メソッドも呼び出す必要があることに注意してください。
| pUndoManager | IOleUndoManager* | in | アンドゥマネージャーへのポインター。IOleUndoManager を参照してください。 |
戻り値
このメソッドは成功時に S_OK を返します。
解説(Remarks)
アンドゥユニットは、自身の処理を実行する責任を持ちます。自身のアンドゥ処理を実行すると、それ自体が別のアクションとなり、再び反転できる可能性があります。ただし、pUndoManager が NULL の場合、アンドゥユニットはアンドゥ処理を実行すべきですが、リドゥスタックやアンドゥスタックには何も追加しようとしてはなりません。
pUndoManager が NULL でない場合、ユニットは対応するユニットをリドゥスタックまたはアンドゥスタックに追加する必要があります。その結果、このメソッドは自身をリドゥスタックまたはアンドゥスタックに移動するか、新しいアンドゥユニットを作成して適切なスタックに追加します。新しいアンドゥユニットを作成した後、このアンドゥユニットは IOleUndoManager::Open または IOleUndoManager::Add を呼び出します。アンドゥマネージャーは、その時点の状態に応じて、新しいアンドゥユニットをアンドゥスタックまたはリドゥスタックに追加します。
親ユニットは、自身に与えられたのと同じアンドゥマネージャー(NULL の場合もあります)を子ユニットに渡さなければなりません。pUndoManager が NULL の場合、コミットされていない限り、リドゥスタックまたはアンドゥスタック上で親ユニットを開くことは許容されますが、必須ではありません。ブロックされた親ユニットは、子ユニットによってスタックに何も追加されないことを保証します。
このアンドゥユニットが親ユニットである場合は、子ユニットに対して Do メソッドを呼び出す前に、自身をリドゥスタックまたはアンドゥスタックに追加する必要があります。
このメソッドを呼び出した後、アンドゥマネージャーはアンドゥユニットを解放しなければなりません。
実装者への注意
アンドゥユニットのエラー処理方針については、IOleUndoManager インターフェースを参照してください。エラー処理方針は、このメソッドの実装、特に親ユニットの実装に影響します。アンドゥまたはリドゥのユーザーインターフェースで使用できる、アンドゥユニットの説明を取得します。
| pBstr | LPWSTR* | out | このアンドゥユニットを説明する文字列へのポインター。 |
戻り値
このメソッドは成功時に S_OK を返します。
解説(Remarks)
すべてのユニットは、自身についてのユーザーが読める説明を提供する必要があります。
呼び出し側への注意
pbstr パラメーターは標準の文字列アロケーターで割り当てられます。この文字列を解放する責任は呼び出し側にあります。アンドゥユニットの CLSID と型識別子を取得します。
| pClsid | GUID* | out | アンドゥユニットの CLSID へのポインター。 |
| plID | INT* | out | アンドゥユニットの型識別子へのポインター。 |
戻り値
このメソッドは成功時に S_OK を返します。
解説(Remarks)
親アンドゥユニットは、子ユニットに対してこのメソッドを呼び出し、それらに特別な処理を適用できるかどうかを判断できます。返される CLSID は、アンドゥユニット自身の CLSID、その作成元オブジェクトの CLSID、または任意の GUID のいずれかにできます。アンドゥユニットは CLSID_NULL を返すこともでき、その場合、呼び出し側はこのユニットの型について何も仮定できません。唯一の要件は、CLSID と型識別子を合わせて、この種類のアンドゥユニットを一意に識別できることです。
アンドゥマネージャーおよび親アンドゥユニットには、子ユニットをその型に基づいて受け入れたり拒否したりする選択肢がないことに注意してください。
コレクション内の最後のアンドゥユニットに、新しいユニットが追加されたことを通知します。
戻り値
このメソッドの実装は常に S_OK を返します。HRESULT の戻り値の型は、リモート化のためだけに使用されます。
解説(Remarks)
オブジェクトはあるアクションのためにアンドゥユニットを作成してアンドゥマネージャーに追加できますが、プライベートインターフェースを通じてそのユニットにデータを挿入し続けることも可能です。アンドゥユニットがこのメソッドの呼び出しを受け取ると、コンテキストが変化したことを作成元オブジェクトに伝えます。その後、作成元オブジェクトはアンドゥユニットへのデータ挿入を停止します。
親アンドゥユニットは、最後に追加された子アンドゥユニットに対してこのメソッドを呼び出し、コンテキストが変化して新しいアンドゥユニットが追加されたことをその子ユニットに通知します。
たとえば、このメソッドは、タイプ入力のように明確な終了点を持たず、他の何かが起こったときにのみ終了する「あいまいなアクション」をサポートするために使用されます。
アンドゥマネージャーまたは開いている親ユニットが、代わりに IUnknown::Release を呼び出してユニットを破棄することを選択した場合、このメソッドは必ずしも呼び出されるとは限りません。プライベートインターフェースを通じて背後でアンドゥユニットにデータを供給する接続は、アンドゥユニットに対して IUnknown::AddRef を行うべきではありません。
実装者への注意
親ユニットは、このメソッドを最後に追加された子ユニットに単に委譲するだけであることに注意してください。親ユニットは、閉じられる際にプライベートインターフェースを通じた通信を終了する必要があります。親ユニットは、IOleParentUndoUnit::Close の呼び出しから S_FALSE を受け取ったときに、自身が閉じられていることを認識します。Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IOleUndoUnit "{894AD3B0-EF97-11CE-9BC9-00AA00608E01}" #usecom global IOleUndoUnit IID_IOleUndoUnit "{}" #comfunc global IOleUndoUnit_Do 3 sptr #comfunc global IOleUndoUnit_GetDescription 4 var #comfunc global IOleUndoUnit_GetUnitType 5 var,var #comfunc global IOleUndoUnit_OnNextAdd 6 ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IOleUndoUnit "{894AD3B0-EF97-11CE-9BC9-00AA00608E01}" #usecom global IOleUndoUnit IID_IOleUndoUnit "{}" #comfunc global IOleUndoUnit_Do 3 sptr #comfunc global IOleUndoUnit_GetDescription 4 sptr #comfunc global IOleUndoUnit_GetUnitType 5 sptr,sptr #comfunc global IOleUndoUnit_OnNextAdd 6 ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。