如何处理COM服务器方法返回未记录的IUnknown



我从类型库(硬件SDK的一部分)导入的COM接口的一些方法返回或接收类型为IUnknown的值。例如,SDK文档指定了如下方法:

bool SetInput1Selection(InputSelection inputSelection)
InputSelection GetInput1Selection()

但是Delphi导入了这样的方法:

function SetInput1Selection(const inputSelection: IUnknown): WordBool; safecall;
function GetInput1Selection: IUnknown; safecall;

类型InputSelection似乎是一个简单的整数或枚举类型,但没有在任何位置指定。该文档只给出了一个包含14个不同可能值的表格,以及它们的含义。

理想情况下,我想声明我自己的类型:

TInputSelection = (isCustom, isStartReset, ...)

以下是类型库如何定义这些函数:

virtual HRESULT __stdcall SetInput1Selection (/*[in]*/ IUnknown * inputSelection, /*[out,retval]*/ VARIANT_BOOL * pRetVal ) = 0;
virtual HRESULT __stdcall GetInput1Selection (/*[out,retval]*/ IUnknown * * pRetVal ) = 0;

但是我该怎么做呢?

整数/枚举和接口在TypeLibrary中的描述不同,因此TypeLibrary导入程序不太可能混淆它们。我的猜测是,InputSelection实际上是一种封装其他数据的接口类型,并且可能有自己的属性/方法来访问这些数据。如果该接口没有出现在TypeLibrary中,那么它可能是一个专用接口。

您可以尝试在GetInput1Selection()返回的IUnknown上调用QueryInterface(),要求它提供IDispatch接口。如果崩溃,则IUnknown不是有效的接口指针,这将返回到可能的错误导入。但如果它没有崩溃,它很可能是一个真正的接口,特别是如果QueryInterface()成功的话。如果是,请调用IDispatch.GetTypeInfo()查看它是否描述了自己。如果是这样,您可以发现接口实现的所有属性和方法,包括参数。在某些环境中,如果基于IDispatch的对象只是POD值的包装器,比如整数,那么它通常具有Value属性,甚至还有一个特殊的DISPID用于访问这样的属性IDispatch.Invoke()(我记不起实际的DISPID编号,我必须查找它)。

更新:您有可能正在对Nanotec步进电机进行编程吗?我在网上找到了类似于你提到的功能的文档:

GetInput1Selection
Definition:
InputSelection GetInput1Selection()
This function outputs the function for digital input 1.
The function corresponds to serial command ':port_in_a'.
SetInput2Selection
Definition:
bool SetInput2Selection(InputSelection inputSelection)
This function sets the function for digital input 2.
The value returned by the function can be used to check that the command was correctly recognized by the controller.
The function corresponds to serial command ':port_in_b'.

不幸的是,它并没有描述InputSelection到底是什么

相关内容

  • 没有找到相关文章

最新更新