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

为什么有些DLL函数在64位Windows上会失败?,dll,64-bit,windows-server-2003,lotus-domino,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 Strin

我正在尝试在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”,然后…
-将声明中的库更改为dll的完整路径-这会在调用函数时产生“加载dll时出错”

在64位服务器上调用shell32函数时,有什么必须以不同方式执行的吗?

函数调用在某台特定服务器上失败的任何其他原因?

我猜只要
就可能是罪魁祸首-它可能是32位上的位整数,64位上的位整数…

是否尝试使用“Declare function FindExecutable Lib”shell32.dll“Alias”FindExecutable w执行该脚本的程序是64位应用程序吗?如果是这种情况,则此应用程序可能无法加载32位DLL。(这将是第二个问题)

要查找第一个问题,请使用
LoadLibrary
(不要使用完整路径!)显式加载
shell32.dll
,然后使用
GetModuleFileName
加载完整文件名。可能会有各种各样的事情造成DLL路径的混乱。(WOW层、UAC、路径变量等)


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

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


如果“只要”是问题所在,则可能无法修复。LotusScript没有任何64位类型。将尝试另一个答案,并希望它能工作。这取决于您的脚本是否在64位上下文中解释。如果解释器本身是一个32位应用程序,那么它也将使用32位版本的shell32.dll。我刚刚用别名“FindExecutableW”尝试过它,但它仍然显示“找不到外部函数”。请尝试在64位系统中更改“shell32.dll”和dll的路径。如果显式调用“C:\Windows\SysWOW64\shell32.dll”它可能会工作,因为它将在64位系统中加载32位版本。虽然我很好奇为什么魔兽世界没有注意到这一点。我认为程序(Lotus Domino 8.5)是32位的,但不确定。这是正确的检查方法,但有一种更强大的方法-只需使用Process Monitor查看DLL从何处加载-您将很容易看到它们是64位DLL还是32位DLL。我认为我没有任何方法使用Process Monitor。。。这是操作系统中的东西还是第三方(例如SysInternal)程序?除了通过Domino服务器可以访问的内容外,我无法直接访问操作系统。@Scott Leis:如果您获得远程桌面并运行Process Monitor,您会做得更好-当尝试加载库时,Process Monitor将显示一系列文件系统访问以及它们产生的错误代码有趣的是,尽管IBM页面表明只有一些DLL函数存在问题。