2015-12-22 117 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節點,並將整數的文本表示形式作爲節點的值。如果這是目標,則可以編寫更多代碼。