2014-10-12 28 views
2

我不得不將一個經典的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

回答

0

檢查應用程序池高級設置,選擇「啓用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

0

所以我其實遇到這個問題我自己,而移植一些舊的網站到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

相關問題