我继承了一个自定义测试设备,其中一个控件库内置在一个COM对象中,我正在尝试将它连接到我们的Tcl测试脚本库。我可以使用TCOM连接到DLL,并使用单个int
参数执行一些简单的控制操作。但是,某些功能是通过传入包含控制块的C / C ++ struct
来控制的,并且尝试在TCOM中使用它们会给我一个错误0x80020005 {Type mismatch.}
。结构在.idl文件中定义,因此TCOM可以使用它。
最简单的例子是如下特定呼叫:
C ++ .idl文件:
struct SourceScaleRange
{
float MinVoltage;
float MaxVoltage;
};
interface IAnalogIn : IDispatch{
...
[id(4), helpstring("method GetAdcScaleRange")] HRESULT GetAdcScaleRange(
[out] struct SourceScaleRange *scaleRange);
...
}
Tcl包装器:
::tcom::import [file join $::libDir "PulseMeas.tlb"] ::char
set ::characterizer(AnalogIn) [::char::AnalogIn]
set scaleRange ""
set response [$::characterizer(AnalogIn) GetAdcScaleRange scaleRange]
结果错误:
0x80020005 {Type mismatch.}
while executing
"$::characterizer(AnalogIn) GetAdcScaleRange scaleRange"
(procedure "charGetAdcScaleRange" line 4)
当我转储TCOM的方法时,它至少知道struct
的名称,但它似乎删除了struct
关键字。一些内省代码
set ifhandle [::tcom::info interface $::characterizer(AnalogIn)]
puts "methods: [$ifhandle methods]"
返回
methods: ... {4 VOID GetAdcScaleRange {{out {SourceScaleRange *} scaleRange}}} ...
我不知道这是否有意义。
此时,我很乐意了解下一步的观点。这是一个已知的TCOM限制(未记录,但已知)?有没有办法使用tcom将参数预处理为适当的格式?我需要通过手动构建通过二进制格式将其强制插入正确大小的内存块吗?我是否需要将DLL带回原始开发人员并让他取出所有结构参数? (在这个现实中不太可能发生。)任何输入都是良好的输入。