私はIDispatch
インターフェースの実装に直面しています。4つの方法があり、幸い3つは簡単です。
function TIEEventsSink.GetTypeInfoCount(...): HResult;
{
Result := E_NOTIMPL;
}
function TIEEventsSink.GetTypeInfo(...): HResult;
{
Result := E_NOTIMPL;
}
function TIEEventsSink.GetIDsOfNames(...): HResult;
{
Result := E_NOTIMPL;
}
それが最後の方法です、Invoke
それは難しいです。ここで、実際にDispIDをケースに入れて、適切なメソッドを呼び出す必要があります。バリアント配列からのパラメーターのマーシャリング解除。
function Invoke(
dispIdMember: DISPID;
riid: REFIID;
lcid: LCID;
wFlags: WORD;
var pDispParams: DISPPARAMS;
var pVarResult: VARIANT;
var pExcepInfo: EXCEPINFO;
var puArgErr: DWORD
): HRESULT;
面倒な定型コードをすべて書く必要はなく、バグがあると確信しているので、作業を行うのではなく、グーグルで調べました。
私はこのスニペットをMSDNドキュメントでIDispatch.Invoke
見つけました:
通常、 Invokeを直接実装しないでください。
素晴らしい!とにかくそれを実装したくありませんでした!続きを読む:
代わりに、ディスパッチインターフェイスを使用して、関数CreateStdDispatchおよびDispInvokeを作成します。詳細については、CreateStdDispatch、DispInvoke、IDispatchインターフェイスの作成、およびActiveXオブジェクトの公開を参照してください。
IDispatchインターフェイスの作成リンクには次のように記載されています。
IDispatchは、次のいずれかの方法で実装できます。
- [をちょきちょきと切る]
- CreateStdDispatch関数を呼び出します。このアプローチは最も単純ですが、豊富なエラー処理や複数の国語を提供していません。
- [をちょきちょきと切る]
すばらしい、CreateStdDispatchは次のとおりです。
単一の関数呼び出しを介してIDispatchインターフェースの標準実装を作成します。これにより、自動化によるオブジェクトの公開が簡単になります。
HRESULT CreateStdDispatch( IUnknown FAR* punkOuter, void FAR* pvThis, ITypeInfo FAR* ptinfo, IUnknown FAR* FAR* ppunkStdDisp );
私はそれを次のように呼ぶつもりでした:
CreateStdDispatch(
myUnk, //Pointer to the object's IUnknown implementation.
anotherObject, //Pointer to the object to expose.
nil //Pointer to the type information that describes the exposed object (i has no type info)
dispInterface //the IUnknown of the object that implements IDispatch for me
);
私が理解できないのは、Windows APIの実装がCreateStdDispatch
、オブジェクトで呼び出すメソッドをどのように知っているかです。特に、CreateStdDispatch
使用しているオブジェクト指向言語やその呼び出し規約がわからないためです。
どうやっCreateStdDispatch
て知るのか
- 特定のメソッドを呼び出す方法は何
dispid
ですか? - 私の言語の呼び出し規約?
- オブジェクト指向オブジェクトが書かれている言語からの例外を処理する方法は?
注:私はdispinterface
;を実装する以外に選択肢はありません。私はインターフェースを定義しませんでした。私はそれが単純な早期の限界IUnknown
であったことを望みます、しかしそれはそうではありません。