2016-02-04 54 views
0

对不起,关于这个问题的背景含糊不清的信息,首先我正在使用的实际类型库受到不公开的协议,第二我没有直接访问系统出现问题。COM调用XP崩溃Win7应用程序

我有类似下面的TLB因为我在Free Pascal中谈论到设备的COM接口:

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 32bit如下

d := MyDevice.Subsystem.Sensors['ID23'].Value; 

这工作正常。

在Windows 7 64位,制造商仍然有一个32位的COM接口,并从我的32位可执行文件的所有其他调用工作正常 - 只是上面的一个使我的可执行文件崩溃。它甚至没有引发异常,它只是崩溃。与

var o: oleVariant; 
// ... 
o = 'ID23'; 
d := MyDevice.Subsystem.Sensors[o].Value; 

同样的情况,因为我没有访问该系统直接,调试是相当繁琐和我花了一段时间来将问题隔离到正是这个电话。

有趣的是,Win7 64bit的其他编程语言使用相同的COM接口不需要显示这个问题。

有没有人有建议如何在特定情况下解决这个问题?

回答

0

我只能给你一些指点,试图/警惕:

  • FPC 3.0支持SEH例外64位,而不是32位
  • FPC似乎有一些问题,调度接口的默认属性。尝试直接使用getlistitem()。