我正在尝试在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函数时,有什么必须以不同方式完成的吗? 函数调用在某个特定服务器上失败的任何其他原因?
答案 0 :(得分:2)
我自己在64位Domino上使用自定义64位DLL遇到了这个问题。看来这可能是64位版本的Domino上的一个已知问题,IBM决定将其称为“永久限制”:
答案 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
,但我认为在此之前你会遇到问题。