0

我遇到了访问冲突错误 [模块“rtl170”中地址 5005F6E 的访问冲突。使用 IInterfaceList 读取地址 0000000A]。我的代码看起来像这样:

if  not Assigned(FoRoutingCodes) then Exit;
for i := 0 to FoRoutingCodes.nCount - 1 do
begin
  ...
end;

FoRoutingCodes 的声明是:

FoRoutingCodes : IRoutingCodeList;

以及IRoutingCodeList的定义

IRoutingCodeList = interface
  function GetCount: Integer;
    ...
  property nCount: Integer read GetCount;
end;

nCount 属性的实现是:

function TRoutingCodeList.GetCount: Integer;
begin
  Result := 0;
  if Assigned(FoItems) then
    Result := FoItems.Count; // here i get the access violation error
end;

其中 TRoutingCodeList 是 IRoutingCodeList 的实现,FoItems 声明为:

FoItems: IInterfaceList;

我已经解决了这个问题

FoItems: TList<IRoutingCode>;

代替

FoItems: IInterfaceList;

我是德尔福的新手,谁能帮我理解以前的方法有什么问题。我不知道这是否相关,因为我们的产品还有很多其他变化,但是这个问题是在我们从 Delphi XE 迁移到 Delphi XE3 之后才出现的。

提前致谢。

更新:回应 Uwe Raabe

我已将 FoItems 初始化从

constructor TRoutingCodeList.Create;
begin
  FoItems := TInterfaceList.Create;
end;

constructor TRoutingCodeList.Create;
begin
  FoItems := TList<IRoutingCode>.Create;
end;
4

1 回答 1

0

仅考虑您到目前为止发布的代码,我看不出问题所在。但是,由于您知道错误的确切位置,我的建议是在代码中的该行设置断点并评估 (CTRL+F7) 成员FoItems以查看它是什么。

通常,当我怀疑我有一个错误的对象引用时,我会评估它的ClassName (在你的情况下是FoItems.ClassName)。如果引用无效,此方法通常会引发异常,即返回一个奇怪的名称。

此外,在构造函数中设置断点以确保 FoItems 确实被实例化。

我希望这有帮助!

于 2013-07-17T14:46:52.350 回答