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

问题描述 投票:4回答:1

我面对实现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.InvokeIDispatch.Invoke。有关详细信息,请参见CreateStdDispatchDispInvokeCreateStdDispatchDispInvoke

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,但不是。

winapi com native-code idispatch
1个回答
4
投票

the interface中传递的IUnknown参数是否公开所有方法信息?

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

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

© www.soinside.com 2019 - 2024. All rights reserved.