Почему некоторые функции DLL не работают в 64-битной Windows? - PullRequest
2 голосов
/ 08 октября 2010

Я пытаюсь запустить некоторый код LotusScript (очень похожий на Visual Basic) в Lotus Domino на серверах Windows.
Код вызывает некоторые функции 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» с тем же результатом.

У меня также:
-Для сравнения попытался вызвать функцию GetForegroundWindow в user32.dll - это работает.
- Использовал функцию Dir, чтобы подтвердить, что shell32 существует с путем "c: \ windows \ syswow64 \ shell32.dll", затем ...
- изменен lib в объявлении на полный путь к dll - при вызове функции появляется «Ошибка при загрузке DLL».

Есть ли что-то, что должнобыть сделано по-другому при вызове функций shell32 на 64-битном сервере?
Есть ли другие причины, по которым вызов функции не будет выполнен на одном конкретном сервере?

Ответы [ 4 ]

2 голосов
/ 10 июня 2011

Просто столкнулся с этим с помощью собственной 64-битной DLL на 64-битном Domino. Похоже, что это может быть известной проблемой в 64-битных версиях Domino, которую IBM решила назвать «постоянным ограничением»:

LO47066: «ВНЕШНЯЯ ФУНКЦИЯ НЕ НАЙДЕНА». ОШИБКА ОТ АГЕНТА LOTUSSCRIPT ИСПОЛЬЗОВАНИЯ НЕКОТОРЫХ ФУНКЦИЙ DLL В ДОМИНО 64-БИТ

0 голосов
/ 08 октября 2010

Пытались ли вы использовать "Объявление функции FindExecutable Lib" shell32.dll "Псевдоним" FindExecutableW ""

0 голосов
/ 08 октября 2010

Программа, выполняющая этот скрипт, это 64-битное приложение? В таком случае возможно, что это приложение не сможет загрузить 32-битные библиотеки DLL. (Это будет вторая проблема)

Чтобы отследить первую проблему, загрузите shell32.dll явно, используя LoadLibrary (не используйте полный путь!), А затем используйте GetModuleFileName, чтобы получить полное имя загруженного файла. Там может быть все виды вещей, ответственных за путаницу с путями DLL. (Слой WOW, UAC, переменная пути, ...)

Если это действительно работает, вы можете попробовать использовать Dependency Walker, чтобы проверить, экспортируется ли FindExecutable, но я думаю, что до этого у вас возникнут проблемы.

0 голосов
/ 08 октября 2010

Я предполагаю, что виновником здесь может быть As Long - вероятно, это 32-разрядное целое число в 32-разрядном и 64-разрядное в 64-разрядном ...

...