【问题标题】:Why would some DLL functions fail on 64-bit Windows?为什么某些 DLL 函数在 64 位 Windows 上会失败?
【发布时间】:2010-10-08 06:08:59
【问题描述】:

我正在尝试在 Windows 服务器上的 Lotus Domino 中运行一些 LotusScript 代码(非常类似于 Visual Basic)。
该代码调用了一些 Windows API 函数,在 32 位 Windows 2003 服务器上运行良好,但在我们尝试过的一台 64 位服务器上却无法运行。

这是我们的外部函数声明之一:

Declare Function FindExecutable Lib "shell32.dll" Alias "FindExecutableA" _
(Byval lpFile As String, Byval lpDirectory As String, Byval lpResult As String) As Long

尝试调用该函数时,LotusScript 会产生错误消息“未找到外部函数”。
我已经尝试从声明中删除别名,并将别名更改为“FindExecutable”,结果相同。

我也有:
- 作为比较,尝试在 user32.dll 中调用 GetForegroundWindow 函数 - 这有效。
- 使用 Dir 函数确认 shell32 存在,路径为“c:\windows\syswow64\shell32.dll”,然后...
- 将声明中的 Lib 更改为 dll 的完整路径 - 这会在调用函数时产生“加载 DLL 时出错”。

在 64 位服务器上调用 shell32 函数时有什么必须做的不同的事情吗?
函数调用在特定服务器上失败的任何其他原因?

【问题讨论】:

    标签: dll 64-bit windows-server-2003 lotus-domino


    【解决方案1】:

    我自己在 64 位 Domino 上使用自定义 64 位 DLL 时遇到了这个问题。看来这可能是 64 位版本的 Domino 上的一个已知问题,IBM 已决定将其称为“永久限制”:

    LO47066: "EXTERNAL FUNCTION NOT FOUND." ERROR FROM LOTUSSCRIPT AGENT USING SOME DLL FUNCTIONS IN DOMINO 64-BIT

    【讨论】:

    • 有趣,尽管 IBM 页面表明只有 一些 DLL 函数有问题。
    【解决方案2】:

    我的猜测是 As Long 可能是这里的罪魁祸首 - 它可能是 32 位的位整数和 64 位的 64 位...

    【讨论】:

    • 如果“As Long”是问题所在,则可能无法修复。 LotusScript 没有任何 64 位类型。将尝试其他答案,并希望它有效。
    • 这取决于您的脚本是否在 64 位上下文中解释。如果解释器本身是 32 位应用程序,那么它也会使用 32 位版本的 shell32.dll。
    【解决方案3】:

    您是否尝试过使用“Declare Function FindExecutable Lib”shell32.dll”别名“FindExecutableW”“

    【讨论】:

    • 我刚刚用别名“FindExecutableW”试了一下,还是说“找不到外部函数”。
    • 尝试将“shell32.dll”更改为64位系统中DLL的路径。
    • 如果您明确调用“C:\Windows\SysWOW64\shell32.dll”,它可能会工作,因为它将在 64 位系统中加载它的 32 位版本。虽然我很好奇为什么 WOW 还没有解决这个问题。
    【解决方案4】:

    执行该脚本的程序是 64 位应用程序吗?如果是这种情况,则此应用程序可能无法加载 32 位 DLL。 (那将是第二个问题)

    要追踪第一个问题,请使用LoadLibrary 显式加载shell32.dll(不要使用完整路径!),然后使用GetModuleFileName 来加载完整的文件名。可能有各种各样的事情负责弄乱 DLL 路径。 (WOW 层,UAC,路径变量,...)

    如果确实有效,您可以尝试使用 Dependency Walker 来查看是否导出了 FindExecutable,但我认为在此之前您会遇到问题。

    【讨论】:

    • 认为程序 (Lotus Domino 8.5) 是 32 位的,但不确定。
    • 这是正确的检查方法,但还有更强大的方法 - 只需使用进程监视器查看 DLL 的加载位置 - 您将轻松查看这些是 64 位 dll 还是 32-位 dll。
    • 我不认为我有任何方法可以使用进程监视器...是操作系统中的某些东西,还是第三方(例如 SysInternal)程序?
    • 除了通过 Domino 服务器提供的操作系统之外,我无法直接访问操作系统。
    • @Scott Leis:如果你获得远程桌面并运行进程监视器,你会更好 - 当尝试加载库时,进程监视器将一起显示一系列文件系统访问以及它们导致的错误代码。
    猜你喜欢
    • 2011-03-04
    • 2010-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-15
    • 2016-05-04
    • 2019-03-12
    相关资源
    最近更新 更多