我面临着实现一个IDispatch
接口。有四种方法,幸运的是其中三种很简单:
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
,但事实并非如此。