Delphi访问冲突设置IXMLNode



在下面的代码片段中,我在标记为//***的行上遇到了访问违规

procedure TWizardForm.MakeChanges;
var
  XmlNodeNamedList: IXmlNode;
  someInt: Integer;
begin
  someInt := retrieveInteger();
  XmlNodeNamedList := IXmlNode(someInt); // ***
end;

这是我继承的非常旧的代码,在某个时候进行了修补以"使其工作"。你知道我为什么会被侵犯访问权限吗?

IXMLNode这样的接口在Delphi中表示为指向函数列表的指针(实现接口的类的对象实例中的vtable)。整数不是接口。通过类型转换,您告诉编译器整数表示接口指针,但事实并非如此,但编译器相信您。当程序试图使用这个所谓的"接口"时,它会失败,因为它希望在该整数指定的"地址"处找到的函数不存在。整数并没有真正指向接口数据结构。当记忆没有按预期布局时,任何数量的坏事都可能发生;访问违规是你所能期待的最好的事情。(更糟糕的是,如果它没有崩溃,而是悄悄地损坏了应用程序的数据。)

也许最初的代码应该创建一个新的XML节点,并将整数的文本表示作为节点的值。如果这是目标,那么您将有更多的代码要写。

最新更新