我面对实现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;
我不想去写所有繁琐的样板代码,我肯定会出现错误,所以我去了Google搜索-而不是做任何工作。
我在the MSDN Documentation of
IDispatch.Invoke
上找到了此代码段:通常,您不应该直接实现Invoke。
优秀的!我还是不想实现它!继续阅读:
而是使用分派接口创建函数CreateStdDispatch和DispInvoke。有关详细信息,请参见CreateStdDispatch,DispInvoke,Creating the IDispatch Interface和Exposing ActiveX Objects。
Creating the IDispatch Interface链接说:
您可以通过以下任意一种方式实现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
);
我不知道的是
CreateStdDispatch
的Windows API实现如何知道要在对象上调用的方法-尤其是因为CreateStdDispatch
不知道我正在使用哪种面向对象的语言或其调用约定。CreateStdDispatch
如何知道给定
dispid
调用什么方法?我的语言的通话习惯?
如何处理面向对象的语言所产生的异常?
注意:我别无选择,只能实施
dispinterface
;我没有定义the interface。我希望这是一个简单的早期绑定IUnknown
,但是没有。 最佳答案
传递给ITypeInfo
的CreateStdDispatch
参数是否不公开所有方法信息?
因此,您将首先创建类型信息,然后调用CreateDispTypeInfo
并将其传递给CreateStdDispatch
,然后可以使用该类型信息来确定要调用的方法,因为CreateDispTypeInfo
需要包含所有这些信息的INTERFACEDATA
我可能没有办法研究一下,因为我没有时间研究它,但这对我来说很有意义。
我稍后将对此进行调查并更新答案。