我面对实现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。


优秀的!我还是不想实现它!继续阅读:


而是使用分派接口创建函数CreateStdDispatchDispInvoke。有关详细信息,请参见CreateStdDispatchDispInvokeCreating the IDispatch InterfaceExposing 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,但是没有。

最佳答案

传递给ITypeInfoCreateStdDispatch参数是否不公开所有方法信息?

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

我可能没有办法研究一下,因为我没有时间研究它,但这对我来说很有意义。
我稍后将对此进行调查并更新答案。

07-26 00:05