【问题标题】:COM call working on XP crashes Win7 application在 XP 上工作的 COM 调用会导致 Win7 应用程序崩溃
【发布时间】: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


    【解决方案1】:

    我只能给你一些尝试/警惕的建议:

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

    【讨论】:

      猜你喜欢
      • 2015-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多