MSXML:IXMLDOMNode に、MSXML のバージョンを問い合わせるにはどうすればよいでしょうか?
-
16-09-2019 - |
質問
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;