【问题标题】:Have you had DLL's fail after upgrading to 64 bit server?升级到 64 位服务器后有 DLL 失败吗?
【发布时间】:2010-06-15 21:33:08
【问题描述】:

我想知道是否有其他人在升级服务器后遇到过失败的 DLL。

在使用经典 ASP 十年后,我的公司正在升级我们的代码和服务器。我们已经设置了运行 Windows 2008 和 IIS 7 的新服务器。我们的经典 ASP 代码和新的 asp.net mvc 代码运行良好。

当我们开始将旧网站迁移到新服务器时,我们的问题就开始出现了。当尝试在实际服务器机器的浏览器上加载页面时,我们最初收到 500 错误。如果我们刷新页面,那么一些页面会加载,但随后会显示错误:

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

Server.CreateObject 失败

/folder/scriptname.asp,第 24 行

800401f3

顺便说一句:在远程机器上我们只会得到 500 个错误。

第 24 行是脚本中的第一个可执行代码:

'23 lines of comments

set A0SQL_DATA = server.createobject("olddllname.Data")

'the rest of the script

该特定行试图使用一个十年前的 DLL 来创建一个服务器对象。我不认为服务器配置有问题,因为我能够毫无问题地创建“adodb.recordset”服务器对象。

在 64 位系统上运行正确注册的旧 DLL 时是否存在问题?

有没有办法让旧的 DLL 在 64 位系统上工作?

编辑

我已确认该站点的应用程序池在 32 位兼容模式下运行,但无论何时调用 set A0SQL_DATA = server.createobject("olddllname.Data"),该站点仍会发送相同的错误。

【问题讨论】:

  • 当你说升级时——是从 2k3 64 位升级到 2k8 R2(64 位)还是... dll 是 64 位?
  • 如果您完全更改了操作系统,如 Greg 所询问的,那么另一个罪魁祸首可能是权限。 Windows 逐渐收紧了各个版本的权限,您的 DLL 可能正在尝试做一些它在运行它的帐户的上下文中没有权限做的事情。它可能在旧版本的 Windows 上运行良好,默认情况下权限较细且限制较少。
  • @Greg - 我不确定你的问题到底是什么意思。我知道我们之前使用的是 32 位操作系统,现在我们使用的是 windows server 2008。
  • @quakkels,您的 olddllname.Data 是否依赖于其他任何东西?看起来您的 progid 没有在这台 64 位机器上注册。您是否需要注册 (regsvr32) DLL 或其依赖项?尝试运行一个简单的独立应用程序来调用您的“CreateObject”。祝你好运
  • @Syd - 我确实创建了一个简单的经典 asp 应用程序,它使用 CreateObject 创建一个 adodb.recordset 对象。那是成功的

标签: asp-classic 64-bit


【解决方案1】:

在 64 位系统上运行正确注册的旧 DLL 时是否存在问题?

是的,32 位 DLL 不再适用于 64 位 Windows 的最突出示例似乎是 Microsoft Jet Engine,即访问 .mdb 文件所需的驱动程序。从there is no 64-bit version 开始,在经典 ASP 应用程序中访问 .mdb 文件的唯一方法是在 32 位兼容模式下运行 IIS(或准确地说是应用程序池)。


如何检测您是处于 32 位还是 64 位模式(未经测试):

Set shell = CreateObject("WScript.Shell")
Response.Write shell.ExpandEnvironmentStrings("%PROCESSOR_ARCHITECTURE%")

这应该在 64 位模式下输出 AMD64,在 32 位模式下输出 x86(在 64 位处理器上的原生 32 位或 32 位模拟)。

【讨论】:

  • 我与我的系统管理员交谈...他认为该站点已经处于 32 位模式。有什么方法可以确认吗?会不会有不同的问题?
  • @quakkels:我添加了一些 ASP 代码来测试您是处于 32 位还是 64 位模式。
  • @Heinzi - 感谢您的代码。它显示“x86”,但该站点仍然没有运行这个 dll
  • @quakkels:那么肯定还有其他问题。 DLL 是否正确注册?由于它是一个 32 位 COM 对象,您可能想尝试C:\Windows\sysWOW64\regsvr32 path\to\your\old\dll.dll
  • @Heinzi - 我的管理员仔细检查了所有 dll 是否已注册。错误文本仍然没有变化。
【解决方案2】:

嗯,错误 800401f3 的意思是“无效的类名”。这强烈表明 DLL 使用错误的 ProgId 注册(或者 ProgId 完全丢失)。当您的系统管理员验证 DLL 已注册时,他是否也验证了其 ProgId 是“olddllname.Data”?

【讨论】:

  • 嗯...我会和他确认一下。
猜你喜欢
  • 2016-01-02
  • 1970-01-01
  • 1970-01-01
  • 2017-05-21
  • 2013-03-23
  • 2011-04-09
  • 2019-01-11
  • 2015-01-27
相关资源
最近更新 更多