在XP上运行的COM调用崩溃了Win7应用程序

时间:2016-02-04 23:26:48

标签: windows-7 com activex freepascal

对于有关此问题背景的模糊信息感到抱歉,首先我正在使用的实际类型库受制于非披露协议,其次我无法直接访问发生问题的系统。< / p>

对于我在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位exectuable的所有其他调用工作正常 - 只是上面的那个使我的可执行文件崩溃。它甚至没有引发异常,只是崩溃了。

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

由于我无法直接访问所述系统,因此调试非常繁琐,需要一段时间才能将问题完全隔离到此调用。

有趣的是,在Win7 64bit 上使用相同COM接口的其他编程语言不会显示此问题。

是否有人就如何在特定情况下处理此问题提出建议?

1 个答案:

答案 0 :(得分:0)

我只能给你一些指示,试着/警惕:

  • FPC 3.0支持64位的SEH异常,但不支持32位
  • FPC似乎在调度接口的默认属性方面存在一些问题。尝试直接使用getlistitem()。