Delphi支持的访问冲突异常 - >的QueryInterface

时间:2010-03-21 10:10:18

标签: delphi access-violation queryinterface

我有以下代码:

  for i := 0 to FControlList.Count - 1 do
      if Supports(IMyControl(FControlList[i]), IMyControlEx) then
      begin
        MyControlEx := IMyControl(FControlList[i]) as IMyControlEx;
        MyControlEx.DoYourMagic(Self, SomeData);
      end;

在我的应用程序执行期间多次调用此代码,但在某些特定情况下,它在Supports()方法中失败。更具体地说 - 它似乎属于Supports()方法中的QueryInterface()调用。

我检查过FControlList不是nil而且FControlList [i]不是nil而且它仍然发生。

任何想法都将受到赞赏!!!

1 个答案:

答案 0 :(得分:5)

即使FControlList[I]不是nil,也不意味着它指向有效数据。底层对象实例可能已经被释放。

我还建议将类型转换为IMyControlSupports可以将对象和接口作为参数,即使它们是nil,也可以产生所需的结果。

此外,您可以考虑使用这种方式调用supports,以获得代码的便利性和可读性:

if Supports(FControlList[i], IMyControlEx, MyControlEx) then
begin
  MyControlEx.DoYourMagic(Self, SomeData);
end;