【问题标题】:Classic ASP : C0000005 Error on execution经典 ASP:C0000005 执行错误
【发布时间】:2022-02-27 00:01:43
【问题描述】:

我正在尝试在 Windows 2008 64 位 R2 机器上执行经典 ASP 页面。

最初的问题在于注册 dll;现在已经解决了。 Register DLL file on Windows Server 2008 R2

现在当我尝试访问该页面时出现此错误

活动服务器页面错误“ASP 0241”

创建对象异常

index.asp

'(null)' 的 CreateObject 导致异常 C0000005。

服务器对象错误“ASP 0177:c0000005”

当我将代码从 Server.CreateObject 更改为 CreateObject 时,我最终会遇到此错误

Active Server Pages 错误“ASP 0115”意外错误 索引.asp

外部对象中出现可捕获错误 (C0000005)。脚本无法继续运行。

我检查了所有可能的内容 - 访问权限和管理员权限等。 应用程序池设置为无托管代码 + 经典模式。

有解决这个问题的想法吗?

【问题讨论】:

  • 你在创建什么对象?
  • 您要创建的对象是什么?
  • 这是一个自定义对象。从 db 中检索一些东西。我已经注册了dll。没有源代码。
  • 尝试编写一个小的 .vbs 文件来创建对象,只是为了排除组件本身的问题。也许组件依赖于一些外部文件、ODBC 注册表等。

标签: windows asp-classic windows-server-2008-r2


【解决方案1】:

你不会在 ASP 中解决这个问题。 C0000005 是访问冲突异常。当代码尝试读取它尚未分配的内存时会发生这种情况。

dll 在加载时或在对象构建期间做错事。

您是否使用简单的 .vbs 文件测试过 dll?

【讨论】:

  • 如果您要从 VBS 尝试此操作,请务必使用与 ASP ISAPI dll 的“位数”匹配的 vbscript.exe。
  • 这真的很有趣。我创建了一个在线 vbs 文件,只是为了创建对象。当我从自己的目录执行时,出现此错误“(null):0x800700C1”当我将dll和vbs文件复制到c:\ windows \ syswow64 \并执行文件时..我收到此错误“Microsoft控制台基础脚本主机已停止工作”来自 EventVwr “问题签名:P1:cscript.exe P2:5.8.7600.16385 P3:4a5bc670 P4:StackHash_0a9e P5:0.0.0.0 P6:00000000 P7:02ca0068 P8:c0000005 P9:00000008 P10:“
  • @Broken Link:除非您专门使用 syswow64 文件夹中的 [c|w]script.exe,否则您将运行 64 位版本,但您的 dll 将是 32 位。 C1 错误(即 ERROR_BAD_EXE_FORMAT)可能会抱怨这一点。当您运行 32 位版本的 cscript 时,您会看到与 ASP 相同的错误。这确认您的 dll 已损坏并需要修复。
  • 我从 syswow64(C:\Windows\SysWOW64>cscript.exe test.vbs) 运行,我收到错误“Microsoft 控制台基础脚本主机已停止工作” - 看起来 dll 是坏了..
【解决方案2】:

我遇到了完全相同的错误。

在我的情况下,C0000005 错误是由缺少依赖关系引起的。

ProcessMonitor 帮我找到它。 (按进程过滤,勾选“未找到名称”)

将所需文件复制到正确的位置解决了我的问题。 (在我的情况下,VB6FR.dll 是法语中 vb6 所需的依赖项。)

【讨论】:

  • 您的意思是按结果过滤吗?
【解决方案3】:

我也花了几个小时追查这个。

在我的情况下,这是由于多次重用记录集对象而没有在 DB 调用之间关闭它造成的。该代码在几个类似的实例中运行时没有明显问题,然后其中一个停止了对进程的容忍。

当我试图关闭页面末尾的记录集时发生错误,这使得故障排除更加困难。

我清理了代码,确保记录集在调用之间关闭,这解决了问题。

【讨论】:

    【解决方案4】:

    在服务器上安装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"
    

    更糟糕的是,我发现一旦错误发生,即使你修复它你需要回收应用程序池以使错误消失

    【讨论】:

    • 我遇到了类似的 Win 更新问题。我最终不得不升级我的数据库和我们不同的驱动程序。现在一切都好起来了,不需要重新编码。就好像老司机在商场运作一样。
    【解决方案5】:

    我在新的 Windows 10 1803 安装上的 IIS 中运行一些非常旧的 ASP 代码,并让它短暂正常运行,然后在 Office 中运行修复以修复 Outlook 问题后开始收到此错误消息。

    在这种情况下,重新安装 Microsoft Access 数据库引擎可以解决问题。

    【讨论】:

      【解决方案6】:

      我在多次加载 csv 文件数据时遇到了同样的错误。 第 1 步 - 首先创建一个临时表,将 csv 数据传输到临时表中,然后移动到主表并在数据移动后删除临时表。这必须以编程方式完成。

      第 2 步 - 转到 mysql 并选择数据库并使用此查询 SHOW FULL PROCESSLIST; 使用无括号。这将显示正在运行的对象的状态。如果您发现任何状态设置为Sleep 的对象,请在第二次尝试上传文件之前将其清除。通常默认等待时间约为 28000 秒。您需要根据需要减少它。减少等待时间的代码是SET GLOBAL wait_timeout=5;。通过mysql设置。这会将您的全局等待时间重新设置为 5 秒。并根据您的需要进行更改。这应该可以解决您的问题。一切顺利。

      【讨论】:

        【解决方案7】:

        根据我的经验,您使用的是 AVG Free,更新后出现这种错误。

        【讨论】:

          【解决方案8】:

          在尝试使用我自己的 com 控件时遇到了同样的错误,在我的情况下,它原来是由我的 dll 在调试模式下编译引起的。

          有两种解决方法:

          1. 在调试模式下运行 IIS。对于 32 位,您使用以下行: C:\Windows\SysWOW64\inetsrv>w3wp.exe -debug

            请注意,您必须停止 IIS 服务,对于 64 位您使用 System32 中的服务。

          2. 编译发布版本:)

          【讨论】:

            【解决方案9】:

            我在这里添加了这个答案,尽管我意识到这比第一次回答问题时要晚得多。我将答案放在这里,以防其他人免去我刚刚经历的麻烦。

            在我重新安装 Windows 10 后,我的 ASP 页面上也出现了这个错误。以前在我的 localhost IIS 设置上,同一页面没有错误。但是 - 现在它做到了 - 出现以下错误:

            Active Server Pages 错误“ASP 0115”意外错误 index.asp

            外部对象中出现可捕获错误 (C0000005)。脚本无法继续运行。

            我尝试了很多东西来尝试对其进行排序,例如:

            1. 再次重新安装 Windows 10
            2. 在新的 Windows 10 安装上重新安装 IIS
            3. 尝试各种版本的 MySQL 和 ODBC 连接器的组合
            4. 根据此页面上的one of the answers 在 Windows 进程监视器中检查丢失的文件
            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 10)并开始看到同样的错误。我想知道您所暗示的是否可能是 ASP 或其对 Windows 10 的依赖现在容忍“惰性编码”(即 falsies、null 等)的方式发生了变化。
            【解决方案10】:

            您是否刚刚进行了 Windows 更新?我做到了,大约在 2021-11-20 到 21H2 19044.1387。不知何故,更新以及其他更新使我的代码不断崩溃。我发现我可以编写一些错误代码,但是数据库 (MariaDB 10.1) 返回的值不匹配。我发现我可以以不同的方式声明我的 sql 调用以获得正确的返回——但很快就停止了重新编码。不知何故,NULL 的处理方式有所不同。

            我开始怀疑数据库驱动程序的工作方式与以前不同。我将所有连接从Server.CreateObject 更改为CreateObject。最后更新了数据库(我现在使用的是 MariaDB 10.6)并且我正在使用新的专用 MySQL 8.0 Unicode 64 位驱动程序。我正在通过 DSN 连接。

            更新:这些 (C0000005) 错误在使用 Server.CreateObject 时不断出现。只需CreateObject,它现在终于开始看起来很有希望了。

            【讨论】:

              【解决方案11】:

              我正在使用此代码来获取每个页面上的图像高度和宽度,而 WIA 不知何故存在内存泄漏并会随机崩溃 IIS 应用程序池:

                  SET objFSO= CreateObject("Scripting.FileSystemObject")
                  If objFSO.fileExists(is_blog_img) and InStr(is_blog_img,".webp") = 0  Then
                      dim oIMG
                      SET oIMG = CreateObject("WIA.ImageFile") '<< do not use this!
                      oIMG.loadFile(is_blog_img)
                      og_image_h = "" & oIMG.Height
                      og_image_w = "" & oIMG.Width
                      SET oIMG = nothing
                      if og_image_h & "" <> "" then
                          %>
                          <meta property="og:image:width" content="<%=og_image_w %>" />
                          <meta property="og:image:height" content="<%=og_image_h %>" />
                          <%
                      end if
                  else
                      response.write("<!-- no file is_blog_img -->")
                      og_image_w = "0"
                      og_image_h = "0"
                  end if
                  SET objFSO = Nothing 
              

              【讨论】:

                【解决方案12】:

                您可能想查看这篇博客文章,标题为“Classic ASP (ASP 3.0) doesn't work on 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+ 包。

                祝你好运, 标记

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-05-05
                  • 1970-01-01
                  • 2016-10-06
                  • 2010-11-04
                  • 1970-01-01
                  • 2012-02-11
                  相关资源
                  最近更新 更多