2011-09-09 73 views

回答

10

下面的代碼添加到一個單位名稱uMSXMLVersion或您選擇的名稱,並將其添加到您的項目中使用

{----------------------------------------------------------------------------  
    Set Delphi's XMLDocument to use MSXML v6.0 

    Usage: Include unit in project "uses"-list and Delphi will automatically use 
      MSXML v6.0 for TXmlDocument. 
-----------------------------------------------------------------------------} 
unit uMSXMLVersion; 

interface 

implementation 

uses ActiveX, MSXML, MSXMLDOM; 

function CreateDOMDocumentEx: IXMLDOMDocument; 
const 
    CLASS_DOMDocument60: TGUID = '{88D96A05-F192-11D4-A65F-0040963251E5}'; 
begin 
    Result := nil; 
    if CoCreateInstance(CLASS_DOMDocument60, nil, CLSCTX_INPROC_SERVER or 
    CLSCTX_LOCAL_SERVER, IXMLDOMDocument, Result) <> S_OK then 
    Result := CreateDOMDocument; //call the default implementation 
end; 

initialization 
    MSXMLDOMDocumentCreate := CreateDOMDocumentEx; 

end. 
+0

重新分配函數的好方法。我不知道你可以在Delphi中使用這種動態的語言技巧。甚至比這更好的是,創建我正在使用的遺留代碼的人也不知道這個技巧:-) – neves

+0

[致命錯誤] uMSXMLVersion.pas(13):文件未找到:'MSXML.dcu'in Delphi 7個人版。我錯過了什麼? – Slappy

8

msxmldom.pas單元暴露了公共MSXMLDOMDocumentCreate鉤,你可以指定一個自定義的處理程序,例如, :

uses 
    ..., msxmldom; 

const 
    CLASS_DOMDocument60: TGUID = '{88D96A05-F192-11D4-A65F-0040963251E5}'; 

function CreateMSXML6Document: IXMLDOMDocument; 
var 
    Disp: IDispatch; 
begin 
    OleCheck(CoCreateInstance(CLASS_DOMDocument60, nil, CLSCTX_INPROC_SERVER or CLSCTX_LOCAL_SERVER, IDispatch, Disp)); 
    Result := Disp as IXMLDOMDocument; 
    if not Assigned(Result) then 
    raise DOMException.Create('MSXML 6.0 Not Installed'); 
end; 

initialization 
    msxmldom.MSXMLDOMDocumentCreate := CreateMSXML6Document; 
+0

我現在這樣做了。 –

+1

感謝您的回答。我真的認爲你的代碼比Fritz Deelman的代碼好一點,但他之前回答了。 – neves