2011-09-09 3 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 델파이 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