Win 2012R2服务器 - ActiveX组件无法创建对象aspmail 4.0(SMTPsvg.Mailer)IIS8.5
我不得不将一个经典的ASP应用程序从Windows Server 2008移动到Windows Server 2012 R2,并且该应用程序使用一个名为com的对象(aspmail 4.0)从一个名为ServerObjects的公司(不再是业务)(至少没有办法与他们联系)。Win 2012R2服务器 - ActiveX组件无法创建对象aspmail 4.0(SMTPsvg.Mailer)IIS8.5
无论如何,我已经注册了DLL(C:\Windows\SysWOW64\regsvr32.exe d:\components\aspmail4\smtpsvg.dll
),这工作正如我检查注册表(它是100%安装没有问题或错误)。
我已验证该DLL是否正确,并且注册表指向正确的路径(并且只有一条路径)。
我已经将所有我能想到的权限(甚至用“Everyone”帐户测试过)给予DLL文件(和IUSR帐户)。
在应用程序池中禁用32位时,出现“ActiveX component can't create object.
”错误。
随着应用程序池启用32位,它只是崩溃的页面(生成一个致命的除外)在事件日志中有错误如下:
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:
是有我丢失了一些无证设置?我已经去了几十个论坛,并按照所有的信件,但没有任何作品(8小时,头发几乎完全被拉出)。
所以我其实遇到这个问题我自己,而移植一些旧的网站到Windows Server 2012服务器,它似乎是因为上cdonts.dll
的依赖性,其也被称为Collaboration Data Objects for NTS(CDONTS)并且是由Collaboration Data objects for Windows 2000(CDOSYS)取代较早前。
见Where to acquire the CDO Libraries (all versions)
不幸的是,旧的代码我迁移,包括引用
Dim cdo: Set cdo = Server.CreateObject("CDONTS.NewMail")
这将导致错误
ActiveX组件不能创建对象
而不是wri在经过一些研究发现,将旧的服务器上的32位DLL cdonts.dll
迁移到新服务器并查看我是否可以在系统上注册后,会更容易。下面是步骤。
- 位于旧服务器上的
cdonts.dll
位于%SystemRoot%\System32
。 -
将DLL复制到新服务器
这需要一些预先考虑。如果服务器是OS的运行64位版本的文件需要被复制到
%SystemRoot%\SysWow64
与其他32位子系统的DLL,否则,如果它是一个32位的操作系统,将需要被复制到
%SystemRoot%\System32
值得一提的是,DLL可以驻留反正只要正确
regsvr32.exe
被使用,但为了保持整洁的事情的缘故遵循了这一工作流程。 使用正确的子系统版本
regsvr32.exe
来注册该DLL。在这种情况下,它是一个64位服务器,因此需要在32位子系统文件夹中使用regsvr32
来注册该DLL。-
测试应用程序。发现错误已经消失,脚本工作期望使用旧版组件。
C:\>cd %systemroot%\syswow64 C:\Windows\SysWow64\>regsvr32 cdonts.dll
的DLL可能是很老,现在你想在64位操作系统上运行它。大多数情况下,使用32位子系统注册32位DLL足以使这些类型的DLL工作。在这种情况下,尽管它引发了一种“ACCESS VIOLATION”异常,这在基本意义上意味着DLL试图访问内存地址,但它不应该发生(当架构和操作系统从32位变为64位和从版本到版本)。它可能是DLL需要的一个或多个依赖项不存在或已经更改,或者它可能与权限有关。 – Lankymart 2014-10-12 15:07:03
这就是我所担心的。我想我会在DotNet中编写一个组件,并将它作为com对象公开。我已经有用于发送邮件的.Net代码 - 只需将其转换即可。 – MC9000 2014-10-12 17:08:45
你可以使用像[Dependency Walker](http://www.dependencywalker.com/)(很棒的小工具)的东西来看看DLL使用什么样的依赖关系,以及在什么地方发现问题。说实话,如果你只是想用传统的ASP发送电子邮件,只需使用CDONTS库,它将出现在大多数Windows安装中。 SO网站上有很多[tag:cdonts]和[tag:cdo]示例。 – Lankymart 2014-10-13 08:25:14