我面对实现IDispatch
接口。有四种方法,幸运的是其中三种很简单:
IDispatch
这是最后一种方法,function TIEEventsSink.GetTypeInfoCount(...): HResult;
{
Result := E_NOTIMPL;
}
function TIEEventsSink.GetTypeInfo(...): HResult;
{
Result := E_NOTIMPL;
}
function TIEEventsSink.GetIDsOfNames(...): HResult;
{
Result := E_NOTIMPL;
}
很难。在这里,我不得不实际使用DispID并调用我的适当方法。从变量数组中解组参数。
Invoke
[不想写所有繁琐的样板代码,我肯定会出现错误,我去了谷歌搜索-而不做任何工作。
我在function Invoke(
dispIdMember: DISPID;
riid: REFIID;
lcid: LCID;
wFlags: WORD;
var pDispParams: DISPPARAMS;
var pVarResult: VARIANT;
var pExcepInfo: EXCEPINFO;
var puArgErr: DWORD
): HRESULT;
上找到了此代码段:
通常,您不应该直接实现Invoke。
非常好!我还是不想实现它!继续阅读:
相反,使用分派接口创建函数the MSDN Documentation of
IDispatch.Invoke
和IDispatch.Invoke
。有关详细信息,请参见CreateStdDispatch,DispInvoke,CreateStdDispatch和DispInvoke。
Creating the IDispatch Interface链接说:
您可以通过以下任意一种方式实现IDispatch:
- [snip]
- 调用Exposing ActiveX Objects功能。这种方法是最简单的,但是它不能提供丰富的错误处理或多种本国语言。
- [snip]
非常好,Creating the IDispatch Interface是:
通过单个函数调用创建IDispatch接口的标准实现。这简化了通过自动化公开对象的过程。
CreateStdDispatch
我原称它为:
CreateStdDispatch
[我无法弄清楚HRESULT CreateStdDispatch(
IUnknown FAR* punkOuter,
void FAR* pvThis,
ITypeInfo FAR* ptinfo,
IUnknown FAR* FAR* ppunkStdDisp
);
的Windows API实现如何知道要在我的对象上调用的方法-尤其是因为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
如何知道
CreateStdDispatch
调用什么方法?注:我别无选择,只能执行CreateStdDispatch
;我没有定义dispid
。我希望这是一个简单的早期绑定dispinterface
,但不是。
the interface中传递的IUnknown
参数是否公开所有方法信息?
因此您将首先创建类型信息,首先调用ITypeInfo
并将其传递给CreateStdDispatch
,然后可以使用该类型信息来确定要调用的方法,因为CreateDispTypeInfo
需要包含所有这些信息的CreateStdDispatch
] >
我可能没有办法,因为我没有时间研究它,但这对我来说很有意义。我稍后将对此进行调查并更新答案。