问题
I've had to move a classic ASP application from windows server 2008 to Windows Server 2012R2 and the app uses a com object called (aspmail 4.0) from a company called ServerObjects - which is no longer in business (at least there's no way to contact them).
Anyway, I've registered the DLL (C:\Windows\SysWOW64\regsvr32.exe d:\components\aspmail4\smtpsvg.dll
), that works as I checked the registry (it's 100% installed no issues nor errors).
I've verified the DLL is correct and the registry is pointing to the correct path (and that there is only 1 path).
I've given every permission I can think of (even tested it with the "Everyone" account) to the DLL file (and IUSR account).
With 32bit disabled in the app pool, I get the "ActiveX component can't create object.
" error.
With 32bit enabled in the app pool, it just crashes the page (generates a fatal exception) with an error in the event log as follows:
Faulting application name: w3wp.exe, version: 8.5.9600.16384, time stamp: 0x52157ba0 Faulting module name: smtpsvg.dll, version: 4.1.0.0, time stamp: 0x2a425e19 Exception code: 0xc0000005 Fault offset: 0x0004e001 Faulting process id: 0x3f0 Faulting application start time: 0x01cfe5f2dc426b4d Faulting application path: C:\Windows\SysWOW64\inetsrv\w3wp.exe Faulting module path: d:\components\aspmail4\smtpsvg.dll Report Id: 3dd63a38-51e6-11e4-80da-0cc47a302001 Faulting package full name: Faulting package-relative application ID:
Is there some undocumented setting I'm missing? I've gone to dozens of forums and followed everything to the letter, but nothing works (8 hrs now, hair is almost completely pulled out).
回答1:
Check Advanced Settings for Application Pool, option "Enable 32-Bit application"
回答2:
So I've actually come across this issue myself while migrating some old sites to Windows Server 2012 server and it appeared to be because of a dependency on cdonts.dll
which was also known as Collaboration Data Objects for NTS (CDONTS) and was superseded sometime ago by Collaboration Data objects for Windows 2000 (CDOSYS).
See Where to acquire the CDO Libraries (all versions)
Unfortunately, the legacy code I was migrating including references to
Dim cdo: Set cdo = Server.CreateObject("CDONTS.NewMail")
which would cause the error
ActiveX component can't create object
Instead of writing the code, after a little research found it would be easier to just migrate the 32-bit DLL cdonts.dll
from the old server to the new one and see if I can register it with the system, here are the steps.
- Located
cdonts.dll
in%SystemRoot%\System32
on the old server. Copied the DLL to the new server
This would require some forethought. If the server was a running a 64-bit version of the OS the file would need to be copied into
%SystemRoot%\SysWow64
with the other 32-bit subsystem DLLs, otherwise, if it was a 32-bit OS it would need to be copied into
%SystemRoot%\System32
It's worth noting that the DLL can reside anyway as long as the correct
regsvr32.exe
is used, but for the sake of keeping things tidy followed this workflow.Use the correct subsystem version of
regsvr32.exe
to register the DLL. In this case, it was a 64-bit server so needed to register the DLL usingregsvr32
in the 32-bit subsystem folder.Test the application. Found that the error had gone and the script worked as expecting using the legacy component.
C:\>cd %systemroot%\syswow64 C:\Windows\SysWow64\>regsvr32 cdonts.dll
Link that helped me: How to Use CDONTS.DLL on Windows Server 2012 R2
来源:https://stackoverflow.com/questions/26323179/win-2012r2-server-activex-component-cant-create-object-aspmail-4-0-smtpsvg-m