Win 2012R2服务器 - ActiveX组件无法创建对象aspmail 4.0(SMTPsvg.Mailer)IIS8.5

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小时,头发几乎完全被拉出)。

+1

的DLL可能是很老,现在你想在64位操作系统上运行它。大多数情况下,使用32位子系统注册32位DLL足以使这些类型的DLL工作。在这种情况下,尽管它引发了一种“ACCESS VIOLATION”异常,这在基本意义上意味着DLL试图访问内存地址,但它不应该发生(当架构和操作系统从32位变为64位和从版本到版本)。它可能是DLL需要的一个或多个依赖项不存在或已经更改,或者它可能与权限有关。 – Lankymart 2014-10-12 15:07:03

+0

这就是我所担心的。我想我会在DotNet中编写一个组件,并将它作为com对象公开。我已经有用于发送邮件的.Net代码 - 只需将其转换即可。 – MC9000 2014-10-12 17:08:45

+0

你可以使用像[Dependency Walker](http://www.dependencywalker.com/)(很棒的小工具)的东西来看看DLL使用什么样的依赖关系,以及在什么地方发现问题。说实话,如果你只是想用传统的ASP发送电子邮件,只需使用CDONTS库,它将出现在大多数Windows安装中。 SO网站上有很多[tag:cdonts]和[tag:cdo]示例。 – Lankymart 2014-10-13 08:25:14

检查应用程序池高级设置,选择“启用32位应用程序”

+0

不幸的是,32位已启用,但组件存在依赖关系问题。看起来,任何访问网络设置,安全性或图形子例程(稍后写入)的组件都将不再适用于Windows Server 2012或2012R2。微软已经误导了很多开发者认为IIS8 +将继续支持经典ASP--只要你不使用任何组件,它就可以实现。 – MC9000 2014-10-13 06:41:06

+0

OP已经声明,他们在应用程序池设置中启用和未启用32位均已尝试 - *“在应用程序池中启用32位后,它只会使页面崩溃”*。 – Lankymart 2014-10-13 08:22:40

所以我其实遇到这个问题我自己,而移植一些旧的网站到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迁移到新服务器并查看我是否可以在系统上注册后,会更容易。下面是步骤。

  1. 位于旧服务器上的cdonts.dll位于%SystemRoot%\System32
  2. 将DLL复制到新服务器

    这需要一些预先考虑。如果服务器是OS的运行64位版本的文件需要被复制到

    %SystemRoot%\SysWow64 
    

    与其他32位子系统的DLL,否则,如果它是一个32位的操作系统,将需要被复制到

    %SystemRoot%\System32 
    

    值得一提的是,DLL可以驻留反正只要正确regsvr32.exe被使用,但为了保持整洁的事情的缘故遵循了这一工作流程。

  3. 使用正确的子系统版本regsvr32.exe来注册该DLL。在这种情况下,它是一个64位服务器,因此需要在32位子系统文件夹中使用regsvr32来注册该DLL。

  4. 测试应用程序。发现错误已经消失,脚本工作期望使用旧版组件。

    C:\>cd %systemroot%\syswow64 
    C:\Windows\SysWow64\>regsvr32 cdonts.dll 
    

链接,帮助我:How to Use CDONTS.DLL on Windows Server 2012 R2