为什么某些DLL函数会在64位Windows上失败?

时间:2010-10-08 06:08:59

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

我正在尝试在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会生成错误消息“未找到外部函数” 我已经尝试从声明中删除Alias,并将别名更改为“FindExecutable”,结果相同。

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

在64位服务器上调用shell32函数时,有什么必须以不同方式完成的吗? 函数调用在某个特定服务器上失败的任何其他原因?

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

您是否尝试使用“声明函数FindExecutable Lib”shell32.dll“Alias”FindExecutableW“”

答案 3 :(得分:0)

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

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

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