Monday, October 16, 2006

QA - problems using MSXML4 on 64bit Windows

Question:

I ran the iismt to move a site from a 32bit server to a 64bit server. I am getting all kinds of ASP errors and have been told by the code boys that it is a problem with getting msxml4.dll to work properly through the SysWOW64 "layer". The people in the know here have tried registering all the msxml*.dll's they could but we still get the errors. Is there a special MSXML install for 64 bit? I'm sure this isn't enough infor for a full answer but it is all I have. Just hoping someone has ran in to this before and can maybe point me in the right direction? Thanks for any help

Answer:

There is no 64bit MSXML4.DLL. Starting with MSXML6.DLL, there is a native 64bit version.

http://www.microsoft.com/downloads/details.aspx?FamilyID=993C0BCF-3BCF-4009-BE21-27E85E1857B1&displaylang=en

I guess that your application was not tested against MSXML6.DLL, but I suggest that you:

  1. First try to upgrade to MSXML6.DLL 64bit and make your application work with it
  2. If MSXML6.DLL is not working for whatever reason, then try to figure out why your application fails with MSXML4.DLL and WOW64.

Details

I believe your issue is not with MSXML4.DLL nor WOW64 but rather with the mysteries of WOW64 Compatibility (i.e. 32bit apps on 64bit Windows). Let me try to explain what is going on:


  • There is only 32bit MSXML4.DLL, and its ProgID (i.e. what ASP page tries to instantiate) is only in the 32bit "section" of the 64bit Registry and available to 32bit processes.
  • By default, IIS6 runs 64bit w3wp.exe processes and 64bit ASP DLL (you can only load 64bit DLLs into 64bit processes; likewise only 32bit DLLs into 32bit processes)
  • Thus, it is impossible for an ASP page running in 64bit w3wp.exe to instantiate 32bit MSXML4.DLL.
  • No amount of re-registration will help - REGSVR32.EXE can determine if a DLL is 32bit or 64bit and only registers 32bit DLLs in the 32bit section of the Registry.

To allow your ASP pages to use 32bit MSXML4.DLL, you must configure IIS6 to run its worker processes as 32bit. This is a global setting (i.e. IIS6 will only run all 32bit or all 64bit worker processes - so if you choose 32bit worker process, you are really not getting any 64bit benefits from an IIS perspective). You change IIS6 to run 32bit worker processes by running the following command:

CSCRIPT %SYSTEMDRIVE%\Inetpub\AdminScripts\adsutil.vbs SET W3SVC/AppPools/Enable32bitAppOnWin64 1

Conclusion

Long story short - compatibility shims like WOW64 can be confusing and down-right convoluted if you go back and forth between bitness. I suggest that you go Native (64bit) as the first option and only fall back to WOW64 when you run out of options. If you remember a decade ago how painful running Win16 programs were on Win95 or NT4, and how much nicer native Win32 apps ran on Win95 and NT4... same story here.

//David

1 comment:

Unknown said...

If you want to be a part of the inner circle of fashion ones then you need replica louis vuitton handbags . When everyone has the best of lv handbag strategically displayed it is imperative that you have the best handbags too. The louis vuitton bag brand is such that you will see it all around you.