2015-12-22 118 views
-1

在下面的人为的代码片段,我得到一个访问冲突上线标志着// ***德尔福访问冲突设置IXMLNode

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

这是我继承很老的代码,已经修补为“在某个时刻让它工作”。任何想法,为什么我会得到访问冲突?

+1

你为什么期望代码能做任何有用的事情? –

+0

'retrieveInteger'做什么?为什么你不能包含这些信息?这显然是相关的,因为它产生了代码然后试图进行类型转换的价值。 –

回答

3

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

也许最初的代码应该创建一个新的XML节点,并将整数的文本表示形式作为节点的值。如果这是目标,则可以编写更多代码。