MSXML:IXMLDOMNode に、MSXML のバージョンを問い合わせるにはどうすればよいでしょうか?

StackOverflow https://stackoverflow.com/questions/1477559

質問

MSXML のバージョンを確認するにはどうすればよいですか? IXMLDOMドキュメント2 は?与えられた IXMLDOMドキュメント2 同じバージョンの別のドキュメントを作成する必要があります。

異なるバージョンの MSXML から IXMLDOMDocument を指定すると、msxml から例外が発生します。

異なるバージョンの MSXML のオブジェクトを混在させるとエラーになります。

Microsoft は内部的にインターフェイスに、それがどのバージョンの MSXML から来たのかを尋ねることができます。同じものにアクセスする必要があります。


疑似コードで記述された次の仮想関数を考えてみましょう。

String XMLTransform(IXMLDOMNode xml, String xsl)
{
    //Create a document to hold the xml
    IXMLDOMDocument2 xslDocument = new CoDOMDocument();

    //load the xsl string into the xsl dom document
    xslDocument.loadXML(xsl);

    //transform the xml
    return xml.transformNode(xslDocument);     
}

問題は、IXMLDOMNode の由来が次のようになっている場合です。 MSXML6. 。作成された DOMDocument バージョン 3 のものです (MSXML における Microsoft のバージョン依存のため)。これにより、

xml.transformNode()

COM 例外をスローするには:

It is an error to mix objects from different versions of MSXML.

Microsoft はインターフェイスに、それがどのバージョンの MSXML から来たのかを尋ねることができるので、私も同じことをできるはずですが、どうすればよいでしょうか?

あるいは、 IXMLDOMNode, 、どうやって構築できますか? XMLDOMDocument 同じバージョンのオブジェクト...

役に立ちましたか?

解決

私は答えを見つけました(少なくともMSXMLバージョン6.0では機能します)。

インターフェースのタイプ:

DOMDocument60

からの子孫 IXMLDOMDocument30, 、ほとんどの人は IXMLDOMDocument または IXMLDOMDocument2 を使用します。

したがって、渡されたインターフェイスが少なくとも IXMLDOMDocument3 をサポートしていない場合、オブジェクトは少なくともバージョン 6 ではないことがわかります。

procedure DoStuff(doc: IXMLDOMdocument2);
begin
   if not (doc is IXMLDOMDocument3) then
       raise Exception.Create('badness');

   ...
end;

あるいは、次のようにします。

procedure DoStuff(doc: IXMLDocument2);
begin
   if not (doc is DOMDocument6) then
   begin
      DoStuffLegacyImplementation(doc);
      Exit;
   end;

   //Real implementation
   ...
end;
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top