CreateStdDispatch 如何知道要调用哪个方法?

2024-03-18

我面临着实施IDispatch http://msdn.microsoft.com/en-us/library/ms221608.aspx界面。有四种方法,幸运的是其中 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 http://msdn.microsoft.com/en-us/library/ms221479.aspx:

一般来说,你不应该实施Invoke直接地。

出色的!反正我不想实施它!继续阅读:

相反,使用调度接口来创建函数创建标准调度 http://msdn.microsoft.com/en-us/library/ms221135.aspx and 显示调用 http://msdn.microsoft.com/en-us/library/ms221366.aspx。详情请参阅创建标准调度 http://msdn.microsoft.com/en-us/library/ms221135.aspx, 显示调用 http://msdn.microsoft.com/en-us/library/ms221366.aspx, 创建 IDispatch 接口 http://msdn.microsoft.com/en-us/library/ms221063.aspx and 公开 ActiveX 对象 http://msdn.microsoft.com/en-us/library/ms221669.aspx.

The 创建 IDispatch 接口 http://msdn.microsoft.com/en-us/library/ms221063.aspx链接说:

您可以通过以下任一方式实现 IDispatch:

  • [snip]
  • 呼叫创建标准调度 http://msdn.microsoft.com/en-us/library/ms221135.aspx功能。这种方法是最简单的,但它不提供丰富的错误处理或多种国家语言。
  • [snip]

出色的,创建标准调度 http://msdn.microsoft.com/en-us/library/ms221135.aspx it is:

通过单个函数调用创建 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 know

  • 对于给定的调用什么方法dispid?
  • 我的语言的调用约定?
  • 如何处理我的面向对象对象编写语言的异常?

Note: 我别无选择,只能实施dispinterface;我没有定义界面 http://msdn.microsoft.com/en-us/library/aa768309%28v=vs.85%29.aspx。我希望这是一个简单的早期绑定IUnknown,但事实并非如此。


难道不是ITypeInfo参数传入CreateStdDispatch暴露所有方法信息?

所以你首先要创建类型信息调用CreateDispTypeInfo并将其传递给CreateStdDispatch然后可以使用类型信息来确定要调用哪个方法,因为CreateDispTypeInfo需要INTERFACEDATA其中包含所有这些信息

我可能错了,因为我没有时间去研究它,但这对我来说是有意义的。 我稍后会对此进行调查并更新答案。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CreateStdDispatch 如何知道要调用哪个方法? 的相关文章

随机推荐