【发布时间】:2016-02-06 03:57:05
【问题描述】:
很抱歉关于这个问题的背景的模糊信息,首先我正在使用的实际类型库受保密协议的约束,其次我无法直接访问发生问题的系统。
对于我在 Free Pascal 中与之交谈的设备的 COM 接口,我有类似以下 TLB:
Device = interface(IDispatch)
// ...
function GetSubsystem: Subsystem; safecall;
property Subsystem: Subsystem read GetSubsystem;
// ...
end;
Subsystem = interface(IDispatch)
// ...
function GetSensors: Sensors; safecall;
property Sensors: Sensors read GetSensors;
// ...
end;
Sensors = interface(IDispatch)
// ...
function GetListItem(index: OleVariant): Sensor; safecall;
property ListItem[index: OleVariant]: Sensor read GetListItem; default;
// ...
end;
Sensor = interface(IDispatch)
// ...
function GetValue: Double; safecall;
property Value: Double read GetValue;
// ...
end;
如果我读取(根据制造商手册)来自 Windows XP 32 位上的传感器之一的值,如下所示
d := MyDevice.Subsystem.Sensors['ID23'].Value;
这很好用。
在 Windows 7 64 位上,制造商仍然有一个 32 位 COM 接口,并且来自我的 32 位可执行文件的所有其他调用都可以正常工作 - 只是上面的一个使我的可执行文件崩溃。它甚至没有引发异常,它只是崩溃了。同样的情况发生在
var o: oleVariant;
// ...
o = 'ID23';
d := MyDevice.Subsystem.Sensors[o].Value;
由于我无法直接访问所述系统,因此调试非常繁琐,我花了一段时间才将问题完全隔离到这个调用。
有趣的是,在 Win7 64 位上使用相同 COM 接口的其他编程语言没有出现这个问题。
有人对在特定情况下如何解决此问题有建议吗?
【问题讨论】:
标签: windows-7 com activex freepascal