簡體   English   中英

經典 ASP:C0000005 執行錯誤

[英]Classic ASP : C0000005 Error on execution

我正在嘗試在 Windows 2008 64 位 R2 機器上執行經典的 ASP 頁面。

最初的問題在於注冊 dll:現在已修復。 在 Windows Server 2008 R2 上注冊 DLL 文件

現在,當我嘗試訪問該頁面時,出現此錯誤

Active Server Pages 錯誤“ASP 0241”

創建對象異常

索引.asp

'(null)' 的 CreateObject 導致異常 C0000005。

服務器對象錯誤“ASP 0177:c0000005”

當我將代碼從 Server.CreateObject 更改為 CreateObject .. 我最終遇到了這個錯誤

Active Server Pages 錯誤“ASP 0115”意外錯誤 index.asp

外部對象中發生可捕獲錯誤 (C0000005)。 腳本無法繼續運行。

我檢查了所有我能做的 - 訪問和管理員權限等。應用程序池設置為無托管代碼 + 經典模式。

有什么想法可以解決這個問題嗎?

我有完全相同的錯誤。

在我的情況下,C0000005 錯誤是由缺少依賴引起的。

ProcessMonitor 幫我找到它。 (按進程過濾,並選中“未找到名稱”)在 dll 上找不到名稱

在正確的位置復制所需的文件解決了我的問題。 (在我的情況下,VB6FR.dll 是法語中 vb6 的必需依賴項。)

你不會在 ASP 中解決這個問題。 C0000005 是訪問沖突異常。 當代碼嘗試讀取尚未分配的內存時會發生這種情況。

dll 在加載時或在構建對象期間做了一些不好的事情。

您是否使用簡單的 .vbs 文件測試了 dll?

我也花了幾個小時來解決這個問題。

就我而言,這是由於多次重用記錄集對象而沒有在 DB 調用之間關閉它造成的。 該代碼在幾個類似的情況下都沒有出現明顯問題,然后其中一個就停止了容忍該過程。

當我嘗試關閉頁面末尾的記錄集時發生錯誤,這使得故障排除更加困難。

我清理了代碼,確保記錄集在調用之間關閉,這解決了問題。

我不止一次加載 csv 文件數據時遇到同樣的錯誤。 步驟 1 - 首先創建一個臨時表,將 csv 數據傳輸到臨時表中,然后移動到主表並在移動數據后刪除臨時表。 這必須以編程方式完成。

第 2 步 - 轉到 mysql 並選擇數據庫並使用此查詢 (SHOW FULL PROCESSLIST;) 使用不帶剎車。 這將顯示正在運行的對象的狀態。如果您發現任何狀態為“睡眠”的對象,則需要在第二次嘗試上傳文件之前將其清除。 通常默認等待時間約為 28000 秒。 您需要根據要求減少它。 減少等待時間的代碼是( SET GLOBAL wait_timeout=5; )。 不帶剎車使用。 使用這個是mysql。 這會將您的全局等待時間重新設置為 5 秒(根據您的需要進行更改)。 這應該可以解決您的問題。 一切順利。

在服務器上安裝KB4093114后,我遇到了同樣的問題。 (我不是 100% 確定 KB 導致了問題,但我懷疑是因為腳本引擎已更新。)

該問題是由將 varchar(max) 字段輸出到標記的記錄集引起的。 即使錯誤沒有提供行號,我也能夠通過反復試驗將其定位到 varchar(max) 字段的輸出。

<%
...
rs.Open "SELECT LongDescription FROM Table1"
while (not rs.EOF)
   %> <p><%= rs("LongDescription") %></p> <%    ' ERROR HAPPENS BECAUSE OF THIS LINE
   rs.MoveNext
wend
%>

刪除該行可以解決問題。 此外,將字段轉換為非最大 varchar 也會修復它:

 rs.Open "SELECT LongDescription = Cast(LongDescription as varchar(4000)) FROM Table1"

更糟糕的是,我發現一旦錯誤發生,即使你修復了它,你也需要回收應用程序池以使錯誤消失

根據我的經驗,您使用的是 AVG Free,並且在更新后出現此類錯誤。

在嘗試使用我自己的 com 控件時遇到了同樣的錯誤,在我的情況下,它原來是由我的 dll 在調試模式下編譯引起的。

有兩種方法可以解決這個問題:

  1. 在調試模式下運行 IIS。 對於 32 位,您使用以下行:C:\\Windows\\SysWOW64\\inetsrv>w3wp.exe -debug

    請注意,您必須停止 IIS 服務,對於 64 位,您可以使用 System32 中的服務。

  2. 編譯發布版本:)

我在新的 Windows 10 1803 安裝上的 IIS 中運行了一些非常舊的 ASP 代碼,並讓它短暫正確運行,然后在 Office 中運行修復以修復 Outlook 問題后開始收到此錯誤消息。

在這種情況下,重新安裝 Microsoft Access 數據庫引擎解決了該問題。

我在這里添加這個答案,盡管我意識到這比第一次回答問題要晚得多。 我把答案放在這里,以防它為其他人省去我剛剛經歷的麻煩。

重新安裝 Windows 10 后,我的 ASP 頁面上也出現此錯誤。以前在我的本地主機 IIS 設置中,同一頁面沒有出錯。 但是 - 現在它確實 - 出現以下錯誤:

Active Server Pages 錯誤“ASP 0115”意外錯誤 index.asp

外部對象中發生可捕獲錯誤 (C0000005)。 腳本無法繼續運行。

我嘗試了很多方法來嘗試對其進行排序,例如:

  1. 再次重新安裝 Windows 10
  2. 在新的 Windows 10 安裝上重新安裝 IIS
  3. 嘗試各種版本的 MySQL 和 ODBC 連接器的組合
  4. 根據此頁面上的答案之一檢查 Windows Process Monitor 中的丟失文件
  5. 與應用程序池打交道
  6. 使用許多版本的 Microsoft Visual C++ Redistributables

我的問題是 SQL 插入 - 當它運行時,我收到錯誤。

這是它的精簡版:

sql = ""
sql = sql & " INSERT INTO my_table ( "
sql = sql & " card_sender,  "
sql = sql & " senders_email,  "
sql = sql & " recipients_email,  "
sql = sql & " card_body,  "
sql = sql & " session_id, "
sql = sql & " replyID) VALUES ( "
sql = sql & " ?,  "
sql = sql & " ?,  "
sql = sql & " ?,  "
sql = sql & " ?,  "
sql = sql & " ?,  "
sql = sql & " ?)  "

Set stmt = Server.CreateObject("ADODB.Command")
stmt.ActiveConnection = oConn
stmt.Prepared = true
stmt.commandtext = sql

stmt.Parameters.Append stmt.CreateParameter("@001_card_sender", adVarChar, adParamInput, 255, card_sender)
stmt.Parameters.Append stmt.CreateParameter("@002_senders_email", adVarChar, adParamInput, 255, senders_email)
stmt.Parameters.Append stmt.CreateParameter("@003_recipients_email", adVarChar, adParamInput, 255, recipients_email)
stmt.Parameters.Append stmt.CreateParameter("@004_card_body", adLongVarChar, adParamInput, 256665, card_body)
stmt.Parameters.Append stmt.CreateParameter("@sessionsessionID", adVarChar, adParamInput, 255, session.sessionID)
stmt.Parameters.Append stmt.CreateParameter("@replyID", adVarChar, adParamInput, 255, session("replyID"))

stmt.Execute
Set stmt = Nothing

通過構建 SQL 並查找哪一行觸發錯誤的過程,我發現此行導致了問題:

stmt.Parameters.Append stmt.CreateParameter("@replyID", adVarChar, adParamInput, 255, session("replyID"))

在我的示例中,沒有設置session("replyID")值,這觸發了錯誤。

當我更改代碼以檢查會話變量是否已設置時,它解決了問題:

...
foo = session("replyID")
if foo = "" then foo = 1
...
stmt0003.Parameters.Append stmt0003.CreateParameter("@replyID", adVarChar, adParamInput, 255, foo)

更多的測試證實,任何為空的變量都會發生錯誤,所以我必須為每個變量添加一個 if 語句,如果它為空,則將其設置為某些內容,以防止這些我不習慣出現的錯誤在同一台 PC 上安裝了以前的 Windows 10。

在花了大約一天的時間研究它之后,找到它的底部是一種解脫。

您剛剛進行了 Windows 更新嗎? 我做到了,大約在 2021-11-20。 不知何故,更新使我的代碼不斷崩潰。 我發現我可以解決一些錯誤,但是數據庫 (MariaDB 10.1) 返回的值沒有匹配。 我發現我可以以不同的方式聲明對數據庫的調用以獲得正確的回報——但很快就停止了重新編碼。

我開始懷疑數據庫的驅動程序運行不佳。

我最終更新了數據庫(我現在使用的是 MariaDB 10.6)並且我正在使用新的專用驅動程序,一切都很好。

您可能想查看這篇博客文章,標題為“Classic ASP (ASP 3.0) 不適用於 64bit with 32bit COM objects”http://blogs.msdn.com/b/robgruen/archive/2005/05/26 /422328.aspx

它有點過時,作者錯誤地將 ASP 處理程序稱為 ISAPI 過濾器(它是一個擴展,而不是過濾器),但除此之外,信息似乎很好。

如果僅將 asp 處理程序編譯為 64 位,則無論您做什么,都無法將 32 位 COM 對象加載到其中。

作者確實提到了一些關於 COM+ 解決方案的內容。 我有一種感覺,一個 32 位進程外 COM+ 包將能夠加載這個 32 位 COM 對象,並且您的 ASP 頁面可以對這個 COM+ 包進行跨進程調用。

祝你好運,馬克

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM