3

我从类型库(硬件 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;

但我怎样才能使这项工作?

4

1 回答 1

3

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

您可以尝试的一件事是调用返回QueryInterface()的,询问它的接口。如果崩溃,则不是有效的接口指针,这将回到可能的错误导入。但如果它没有崩溃,它可能是一个真正的接口,特别是如果成功的话。如果是,请致电以查看它是否描述了自己。如果是这样,您可以发现接口实现的所有属性和方法,包括参数。在某些环境中,如果基于 - 的对象只是 POD 值的包装器,例如整数,它通常有一个属性,甚至还有一个特殊的用于访问这样的属性(我不记得实际的数字,我将不得不查找它)。IUnknownGetInput1Selection()IDispatchIUnknownQueryInterface()IDispatch.GetTypeInfo()IDispatchValueDISPIDIDispatch.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实际情况。

于 2012-12-16T19:23:49.320 回答