【发布时间】:2012-12-03 18:23:38
【问题描述】:
我从类型库(硬件 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;
但是我怎样才能做到这一点呢?
【问题讨论】:
-
如果您知道类型库中的
InputSelection类型是枚举并且您知道它的成员,只需在 Delphi 导入中更正它(按照您显示的方式)。这可能只是错误的导入。 -
@TLama 我尝试用 Integer 代替 TLB 单元中的 IUnknown。但是
GetInput#Selection返回的值似乎与任何允许的值都不对应。它们甚至不映射 1:1,这意味着对于设置了不同值的输入通道返回相同的值(SDK 包含一个测试应用程序,我可以使用它读取/写入输入通道设置)。这里似乎发生了更多事情。有没有“正确”的方式来做到这一点? -
既然不知道SDK你自己看吧,SDK是什么类型的。如果文档中不清楚,您应该询问 SDK 开发人员
-
我有。显然,他们将 sdk 开发外包,现在无法提供任何开发人员支持。不是我购买他们的硬件时所期望的。但现在我必须尽力而为。是否有一些取证方法可以找出如何处理这样的 IUnknown 参数?
-
我在第一条评论中试图说的(或者更好地说是猜测,没有看到你的类型库)是 Delphi 导入器可能在导入该参数时失败,你应该修改你的 Delphi手动导入(如果你知道参数是枚举而不是接口)。
标签: .net delphi interface iunknown