gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:54:55 25 4
gpt4 key购买 nike

我从类型库(硬件 SDK 的一部分)导入的 COM 接口(interface)的一些方法返回或接收 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;

但是我怎样才能做到这一点呢?

最佳答案

整数/枚举和接口(interface)在类型库中的描述不同,因此类型库导入器不太可能使它们混淆。我的猜测是InputSelection实际上是包装一些其他数据的接口(interface)类型,并且可能具有其自己的属性/方法来访问该数据。如果该接口(interface)未出现在类型库中,则它可能是私有(private)接口(interface)。

您可以尝试的一件事是调用 QueryInterface()关于IUnknownGetInput1Selection()返回,要求它提供 IDispatch界面。如果崩溃了,那么 IUnknown不是有效的接口(interface)指针,这可能会导致错误的导入。但如果它没有崩溃,它可能是一个真正的界面,特别是如果 QueryInterface()成功了。如果是,请调用IDispatch.GetTypeInfo()看看它是否描述了自己。如果是这样,您可以发现该接口(interface)实现的所有属性和方法,包括参数。在某些环境中,如果 IDispatch基于对象只是 POD 值的包装,就像整数一样,它通常有 Value属性,甚至还有一个特殊的DISPID用于访问此类属性IDispatch.Invoke() (我不记得实际的 DISPID 号码,我得查一下)。

更新:您有机会对 Nanotec 步进电机进行编程吗?我发现documentation在线类似于您提到的功能:

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事实上是。

关于.net - 如何处理返回未记录的 IUnknown 的 COM 服务器方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13900904/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com