【发布时间】:2011-09-24 09:56:06
【问题描述】:
我面临着实现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;
不想编写所有乏味的样板代码,我肯定会有错误,我去谷歌搜索 - 而不是做任何工作。
我在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,但事实并非如此。
【问题讨论】:
-
你不只是从
TAutoIntfObject派生出来还是我遗漏了什么? -
如果 那些 确实是您对其他三种方法的实现,那么您也不必真正实现
Invoke,因为没有消费者会走得足够远无论如何都要调用它。消费者将调用GetIDsOfNames以找出它想要调用的方法或属性的dispid,但您将响应它没有实现。如果没有 dispid,消费者无法填写第一个Invoke参数。此外,文档并没有说E_NOTIMPL甚至是GetIDsOfNames的有效结果。 -
如果问题中没有关于 delphi 的任何内容,为什么这会被标记为“delphi”? Delphi 从未被提及,所有显示的代码都是 C。
-
@Rob Kennedy:不正确。这是一个调度接口,打电话给我的人(Internet Explorer)已经知道它想要调用的
dispIDs。请参阅 Techvanguard 的自动化事件接收 (techvanguards.com/products/eventsinkimp) 的优秀示例。 -
@Thorsten Engler:我将代码示例更改为具有 Delphi 风格。
标签: winapi com native-code idispatch