经典ASP:C0000005执行时出错

时间:2011-01-10 17:17:55

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

我试图在Windows 2008 64位R2框上执行经典ASP页面。

最初问题在于注册dll:现在已经修复了。 Register DLL file on Windows Server 2008 R2

现在,当我尝试访问该页面时,我收到此错误

  

Active Server Pages错误' ASP 0241'

     

CreateObject Exception

     

index.asp

     

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

     

服务器对象错误' ASP 0177:c0000005'

当我将代码从Server.CreateObject更改为CreateObject时......我最终得到了这个错误

  

Active Server Pages错误' ASP 0115'意外的错误   index.asp

     

外部对象中发生了可捕获的错误(C0000005)。该脚本无法继续运行。

我检查了所有可能的内容 - 访问权限和管理权限等。 应用程序池设置为No Managed Code + Classic模式。

有任何解决此问题的想法吗?

10 个答案:

答案 0 :(得分:2)

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

dll在加载或构造对象时会做坏事。

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

答案 1 :(得分:1)

我有完全相同的错误。

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

ProcessMonitor帮助我找到它。 (按过程过滤,然后选中“找不到姓名”) Name not found on dll

在正确的位置复制所需的文件解决了我的问题。 (就我而言,VB6FR.dll是法语中vb6的必需依赖。)

答案 2 :(得分:0)

我花了好几个小时追逐它。

在我的情况下,它是由多次重用记录集对象而不在DB调用之间关闭它引起的。代码在几个类似的实例中没有明显的问题,然后其中一个只是停止容忍这个过程。

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

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

答案 3 :(得分:0)

根据我的经验,您使用的是AVG Free,在更新后,您遇到了这种错误。

答案 4 :(得分:0)

在尝试使用我自己的com控件时遇到同样的错误,在我的情况下,结果是我的dll在调试模式下编译。

有两种解决方法:

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

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

  2. 编译发布版本:)

答案 5 :(得分:0)

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

步骤2 - 转到mysql并选择数据库并使用此查询(SHOW FULL PROCESSLIST;)使用不带brakets。这将显示正在运行的对象的状态。如果您发现状态为“睡眠”的任何对象,则需要在第二次尝试上载文件之前将其清除。通常默认的等待时间约为28000秒。您需要根据要求减少它。减少等待时间的代码是(SET GLOBAL wait_timeout = 5;)。使用没有支架。使用这是mysql。这会将您的全球等待时间重新设置为5秒(根据您的需要进行更改)。这应该可以解决您的问题。一切顺利。

答案 6 :(得分:0)

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

删除该行可修复问题。此外,将字段强制转换为非max varchar也会修复它:

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

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

答案 7 :(得分:0)

我正在新安装的Windows 10 1803上的IIS中运行一些非常旧的ASP代码,并使其暂时正确运行,然后在Office中运行修复程序以修复Outlook问题后开始获取此错误消息。

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

答案 8 :(得分:0)

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

重新安装Windows 10之后,我的ASP页面上也出现此错误。以前在本地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 Process Monitor中检查丢失的文件
  5. 关于应用程序池的思考
  6. 正在考虑使用许多版本的Microsoft Visual C ++可再发行组件

我的问题出在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)

更多测试证实,任何为null的变量都将发生错误,因此我必须为每个变量添加一个if语句并将其设置为null,以防止我没有使用这些错误以便在同一台PC上安装以前的Windows 10。

花了大约一天的时间进行研究,这使我深感欣慰。

答案 9 :(得分:-2)

您可能想查看此博客条目,标题为“经典ASP(ASP 3.0)无法在64位上使用32位COM对象”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 +包进行跨进程调用。

祝你好运, 标记