Asp classic Win 2012R2服务器-ActiveX组件可以';t创建对象aspmail 4.0(SMTPsvg.Mailer)IIS8.5

Asp classic Win 2012R2服务器-ActiveX组件可以';t创建对象aspmail 4.0(SMTPsvg.Mailer)IIS8.5,asp-classic,com,smtp,email,iis-8.5,Asp Classic,Com,Smtp,Email,Iis 8.5,我不得不将一个经典的ASP应用程序从windows server 2008移动到windows server 2012R2,该应用程序使用了一个名为(aspmail 4.0)的com对象,该对象来自一家名为ServerObjects的公司,该公司已不再营业(至少无法与他们联系) 无论如何,我已经注册了DLL(C:\Windows\SysWOW64\regsvr32.exe d:\components\aspmail4\smtpsvg.DLL),它在我检查注册表时工作(它100%安装,没有问题也没

我不得不将一个经典的ASP应用程序从windows server 2008移动到windows server 2012R2,该应用程序使用了一个名为(aspmail 4.0)的com对象,该对象来自一家名为ServerObjects的公司,该公司已不再营业(至少无法与他们联系)

无论如何,我已经注册了DLL(
C:\Windows\SysWOW64\regsvr32.exe d:\components\aspmail4\smtpsvg.DLL
),它在我检查注册表时工作(它100%安装,没有问题也没有错误)

我已经验证了DLL是否正确,注册表是否指向正确的路径(并且只有一条路径)

我已经为DLL文件(和IUSR帐户)提供了我所能想到的所有权限(甚至使用“Everyone”帐户进行了测试)

在应用程序池中禁用32位后,我得到“
ActiveX组件无法创建对象。
”错误

在应用程序池中启用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: 故障应用程序名称:w3wp.exe,版本:8.5.9600.16384,时间戳:0x52157ba0 故障模块名称:smtpsvg.dll,版本:4.1.0.0,时间戳:0x2a425e19 异常代码:0xc0000005 故障偏移量:0x0004e001 出错进程id:0x3f0 故障应用程序启动时间:0x01cfe5f2dc426b4d 出现故障的应用程序路径:C:\Windows\SysWOW64\inetsrv\w3wp.exe 故障模块路径:d:\components\aspmail4\smtpsvg.dll 报告Id:3dd63a38-51e6-11e4-80da-0cc47a302001 故障包全名: 错误包相对应用程序ID:
有没有我缺少的未记录的设置?我去了几十个论坛,一丝不苟地关注着一切,但没有任何效果(现在8小时了,头发几乎完全被拔出)。

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

因此,我自己在将一些旧站点迁移到Windows Server 2012 Server时遇到了这个问题,这似乎是因为依赖于
cdonts.dll
,后者也称为(cdonts),不久前被(CDOSYS)取代

不幸的是,我迁移的遗留代码中包含了对

Dim cdo:Set cdo=Server.CreateObject(“CDONTS.NewMail”)
这会导致错误

ActiveX组件无法创建对象

与编写代码不同的是,经过一点研究发现,只需将32位DLL
cdonts.DLL
从旧服务器迁移到新服务器并查看是否可以在系统中注册,这将更容易,以下是步骤

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

    这需要事先考虑。如果服务器运行64位版本的操作系统,则需要将文件复制到

    %SystemRoot%\SysWow64
    
    对于其他32位子系统DLL,否则,如果它是32位操作系统,则需要将其复制到

    %SystemRoot%\System32
    
    值得注意的是,只要使用正确的
    regsvr32.exe
    ,DLL就可以驻留,但为了保持整洁,请遵循此工作流

  • 使用正确的子系统版本的
    regsvr32.exe
    注册DLL。在本例中,它是一个64位服务器,因此需要使用32位子系统文件夹中的
    regsvr32
    注册DLL

  • 测试应用程序。发现错误已消失,并且使用旧组件时脚本按预期工作

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

  • 帮助我的链接:

    DLL可能很旧,现在您尝试在64位操作系统上运行它。大多数情况下,使用32位子系统注册32位DLL足以使这些类型的DLL正常工作。在这种情况下,尽管它引发了一个
    访问冲突
    异常,但从基本上来说,这意味着DLL正在尝试访问它不应该访问的内存地址(这将在体系结构和操作系统从32位更改为64位以及从一个版本更改为另一个版本时发生)。可能是DLL所需的一个或多个依赖项不存在或已更改,或者可能与权限相关。这正是我所担心的。我想我将在DotNet中编写一个组件,并将其作为com对象公开。我已经有了用于发送邮件的.Net代码-只需要转换它。您可以使用类似(很棒的小工具)的工具来查看DLL使用的依赖项以及问题可能起源的位置。不过,老实说,如果您只是想用经典ASP发送电子邮件,只需使用大多数Windows安装中提供的CDONTS库即可。在SO站点上有很多示例和示例。32位已启用,但不幸的是,该组件存在依赖性问题。任何访问网络设置、安全性或图形子例程(不久前编写)的组件似乎将不再在Windows Server 2012或2012R2上工作。微软误导了很多开发者,认为IIS8+将继续支持经典ASP-只要你不使用任何组件,它就会支持经典ASP。OP已经声明,他们在应用程序池设置中启用和不启用32位时都进行了尝试-“在应用程序池中启用32位,只会使页面崩溃”。