我从类型库(硬件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;
但我怎样才能做到这一点呢?
答案 0 :(得分:3)
整数/枚举和接口在TypeLibrary中有不同的描述,因此TypeLibrary导入器不太可能让它们混淆。我的猜测是InputSelection
实际上是一个包装其他数据的接口类型,并且可能有自己的属性/方法来访问该数据。如果接口没有出现在TypeLibrary中,那么它可能是一个私有接口。
您可以尝试的一件事就是QueryInterface()
上IUnknown
发出GetInput1Selection()
,并要求IDispatch
接口。如果崩溃,则IUnknown
不是有效的接口指针,这将返回可能的错误导入。但如果它没有崩溃,它可能是一个真正的界面,特别是如果QueryInterface()
成功的话。如果是,请致电IDispatch.GetTypeInfo()
以查看其是否描述了自己。如果是这样,您可以发现接口实现的所有属性和方法,包括参数。在某些环境中,如果基于IDispatch
的对象只是POD值的包装器(如整数),它通常具有Value
属性,甚至还有一个特殊的DISPID
访问此类媒体资源IDispatch.Invoke()
(我不记得实际的DISPID
号码,我必须查看它。)
更新:您是否有机会编程纳米技术步进电机?我发现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
实际上是什么。