Retrieveing COM class factory failure. error: 80040154

64-bitcomdlliis-6visual-studio-2008

Retrieving the COM class factory for component with CLSID {AD37B7D5-B5A3-460A-8FFB-3C71984A4537} failed due to the following error: 80040154.

Exception details:

System.Runtime.InteropServices.COMException: Retrieving the COM class factory for component with CLSID {AD37B7D5-B5A3-460A-8FFB-3C71984A4537} failed due to the following error: 80040154.

I'm using A COM DLL in my ASP.NET Web Application. I have managed to successfully get it working on both my own dev machine and a build machine.
However when I try deploying the project to a different machine (Microsoft Windows Server 2003 R2) I get the above error.

I have registered the COM DLL using the regsvr32 command. It says the DLL was registered successfully.

I am developing the project in Visual Studio 2008 with ASP.NET version 3.5 and building my project to run on any CPU, each machine uses 64-bit Windows.
I'm using IIS version 6.0.
(I have tried enabling IIS to run 32-bit applications, this caused the web application to be unavailable.)

I wrote a Windows script file to check weather the COM DLL was working or not on (i.e. independent from the project).
This script worked fine on both my build machine and my own dev machine.
However it did not run properly on the machine I'm having trouble with (Microsoft Windows Server 2003 R2).
What I had to do was to run the script from the command line using the following command (which I found here):

C:\WINDOWS\SysWOW64\wscript.exe COMtest.js  

The wscript file works succesfully when ran in this way.
I presume it has something to do with the version that the COM DLL was built for.

Do I need to enable some settings in my Visual Studio project?
(Please note I have not built the COM DLL myself. Someone else has built it and given it to me.)

Best Answer

It is COM's FileNotFound error. In this case it is very likely to be a bitness problem. The registry keeps COM registration for 32-bit and 64-bit servers separate. Strongly indicated by it working when you run wscript.exe from the syswow64 directory, that's the home for 32-bit executables. A 64-bit process won't be able to find the 32-bit server in the registry. Nor will it be able to use it. Repro that by running c:\windows\system32\wscript.exe

You will first have to build the x64 version of the COM server so a 64-bit process can use it. Then you will have to register it with the 64-bit version of Regsvr32.exe, the one in c:\windows\system32, not syswow64. If you still have trouble then use SysInterals' ProcMon utility to find out where the process is looking in the registry and file system.

Or get IIS to run in 32-bit mode. That's another question that needs different tags.

Related Topic