我已经从硬件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 导入中进行更正(就像您展示的那样)。这可能只是错误的导入。 - TLamaGetInput#Selection
返回的值似乎不对应任何允许的值。它们甚至没有1:1地映射,这意味着输入通道设置不同值的情况下返回相同的值(SDK包括一个测试应用程序,可以读取/写入输入通道设置)。这里还有其他问题。有没有'正确'的做法? - Gerald Menzelvirtual HRESULT __stdcall SetInput1Selection (/*[in]*/ IUnknown * inputSelection, /*[out,retval]*/ VARIANT_BOOL * pRetVal ) = 0;
和virtual HRESULT __stdcall GetInput1Selection (/*[out,retval]*/ IUnknown * * pRetVal ) = 0;
。所以我认为 Delphi 导入程序已经尽力了。文档似乎暗示InputSelection
是一个枚举类型。但除此之外,我不知道如何解决这个问题。 - Gerald Menzel