Support Statement: msxml2 versioned progIDs

Some systems use both msxml3.dll and msxml6.dll to provide MSXML2 API services.  These are two different versions of the same API, so it makes sense to standardize on one of these, typically msxml6, so that any migration rules for MSXML2 (e.g. upgrading to System.Xml).  This may be accomplished using a registry-libname command.  Place this prior to the <Compile command in your translation script.

<Registry type="libname" source="msxml3.dll" target="msxml6.dll" />

In addition, msxml6.dll requires using version-specific classIDs for the classes that formerly had version-agnostic names.  When using msxml6.dll, you may encounter errors like the following:

ERR#3004: The reference to the foreign class <MSXML2.FreeThreadedDOMDocument> is not defined

These can be resolved by placing typedefs in a project-specific copy of msxml6.dll.xml.  

1) Copy proj\FromIDL\msxml6.dll.xml to your user folder, proj\usr\msxml6.dll.xml

2) Edit the proj\usr\msxml6.dll.xml adding typedefs as needed.  For example:

   <!--
   Added typedefs for backwards compatability to msxml3
   -->

   <typedef id="DOMDocument" type="DOMDocument60"/>
   <typedef id="DOMDocument40" type="DOMDocument60"/>
   <typedef id="FreeThreadedDOMDocument" type="FreeThreadedDOMDocument60"/>
   <typedef id="ServerXMLHTTP" type="ServerXMLHTTP60"/>
   <typedef id="XMLSchemaCache" type="XMLSchemaCache60"/>
   <typedef id="XSLTemplate" type="XSLTemplate60"/>

   <enumeration id="tagDOMNodeType"...


Alternatively, you can standardize on msxml3 and add typedefs to allow for newer versioned classIDs:


In your translations script
<Registry type="libname" source="msxml3.dll" target="msxml6.dll" />

In msxml3.dll.xml

   <!--
   Added typedefs for backwards compatibility with later versions of MSXML2
   -->
   <typedef id="DOMDocument60" type="DOMDocument"/>
   <typedef id="DOMDocument40" type="DOMDocument"/>


See also