Delphi'中的访问冲突异常;s支持->;查询接口

Delphi'中的访问冲突异常;s支持->;查询接口,delphi,access-violation,queryinterface,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);

我有以下代码:

  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,并且它仍然发生


任何想法都将不胜感激

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

我还建议删除强制转换为
IMyControl
的类型<代码>支持可以将对象和接口作为参数,即使它们是
nil
,也可以生成所需的结果

<> P>此外,您可以考虑使用这种方式调用<代码>支持< /代码>,以满足代码的方便性和可接受性:

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

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

我还建议删除强制转换为
IMyControl
的类型<代码>支持可以将对象和接口作为参数,即使它们是
nil
,也可以生成所需的结果

<> P>此外,您可以考虑使用这种方式调用<代码>支持< /代码>,以满足代码的方便性和可接受性:

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

您能否在支持调用中删除对IMyControl的强制转换?什么是FControlList,一个接口列表?还要注意,TControl可以有自己的生命周期管理,即使它们是TInterfacedPersistent的子类,但它们不使用引用计数。看,这只是因为TInterfacedPersistent不使用引用计数。否则将使用TInterfacedObject。支持需要为接口定义GUID,我假设您已经为IMyControlEx定义了GUID。您可以在支持调用中删除IMyControl的强制转换吗?什么是FControlList,一个接口列表?还要注意,TControl可以有自己的生命周期管理,即使它们是TInterfacedPersistent的子类,但它们不使用引用计数。看,这只是因为TInterfacedPersistent不使用引用计数。否则将使用TInterfacedObject。支持需要为接口定义GUID,我假设您已经为IMyControlEx定义了GUID。看起来您是对的,它确实有一些释放的数据。这个问题很复杂,我还没有解决它,但是——这就是答案。谢谢看起来你是对的,它确实有一些释放的数据。这个问题很复杂,我还没有解决它,但是——这就是答案。谢谢