当前位置 : 主页 > 编程语言 > delphi >

delphi – CreateStdDispatch如何知道要调用的方法?

来源:互联网 收集:自由互联 发布时间:2021-06-23
我面临着实施 IDispatch 界面的问题.有四种方法,幸运的是其中有三种方法很简单: function TIEEventsSink.GetTypeInfoCount(...): HResult;{ Result := E_NOTIMPL;}function TIEEventsSink.GetTypeInfo(...): HResult;{ Resul
我面临着实施 IDispatch界面的问题.有四种方法,幸运的是其中有三种方法很简单:

function TIEEventsSink.GetTypeInfoCount(...): HResult;
{
   Result := E_NOTIMPL;
}

function TIEEventsSink.GetTypeInfo(...): HResult;
{
   Result := E_NOTIMPL;
}

function TIEEventsSink.GetIDsOfNames(...): HResult;
{
   Result := E_NOTIMPL;
}

这是最后一种方法,Invoke很难.在这里,我面临着必须实际使用DispID,并调用我的适当方法;来自变量数组的unmarhsalling参数.

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发现了这个snippit:

Generally, you should not implement Invoke directly.

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

Instead, use the dispatch interface to create functions 07002 and 07003. For details, refer to 07002, 07003, 07006 and 07007.

Creating the IDispatch Interface链接说:

You can implement IDispatch by any of the following means:

  • [snip]
  • Calling the 07002 function. This approach is the simplest, but it does not provide for rich error handling or multiple national languages.
  • [snip]

很好,CreateStdDispatch它是:

Creates a standard implementation of the IDispatch interface through a single function call. This simplifies exposing objects through Automation.

06002

我打算称它为:

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调用什么方法?
>我语言的召集惯例?
>如何处理写入面向对象的语言的异常?

注意:我别无选择,只能实现调度接口;我没有定义the interface.我希望它是一个简单的早期绑定IUnknown,但它不是.

传递给CreateStdDispatch的ITypeInfo参数是否公开了所有方法信息?

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

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

网友评论