Код VBA не может получить доступ к DLL в System32 - PullRequest
4 голосов
/ 20 мая 2011

Мой код VBA не может получить доступ к моей DLL в папке C: \ Windows \ System32 в Windows 7 64-битной и Word 2010 32-битной.

Private Declare Function my_func Lib "mydll.dll" (ByVal param As String) As Long

Public Sub MyFuncTest
  n = my_func("a")
End

Я скопировал mydll.dll в C: \ Windows \ System32 и вызвал MyFuncTest, но получил сообщение об ошибке типа «Ошибка 53: mydll.dll» не найден ».

Однако я изменил объявление в коде на:

Private Declare Function my_func Lib "C:\Users\myname\Documents\mydll.dll" (ByVal param As String) As Long

Затем я скопировал mydll.dll в C: \ Users \ myname \ Documents, папку Мои документы учетной записи и MyFuncTest успешно выполнен.

Изменение "mydll.dll" на "C: \ Windows \ System32 \ mydll.dll" в объявлении не работает. И я попытался получить доступ к C: \ Windows \ System32 \ mydll.dll с помощью метода FileSystemObject # FileExists в той же среде VBA, но он вернул значение False (не найдено).

Не было проблем в Windows XP и Word 2003.

Может кто-нибудь помочь?

Ответы [ 4 ]

7 голосов
/ 20 мая 2011

Это 32-битная DLL и 32-битный процесс, работающий в эмуляторе WOW64 на 64-битной Windows. Переадресация файла находится в режиме воспроизведения, поэтому, когда 32-битный процесс просматривает system32, он фактически перенаправляется в 32-битный системный каталог SysWOW64.

Простое и быстрое решение - переместить DLL на C:\Windows\SysWOW64. Однако, как указывает Коди Грей в комментарии, не рекомендуется размещать DLL-файлы приложений в системном каталоге. Обычной практикой является размещение библиотек DLL в папке вашего приложения в каталоге программных файлов и убедитесь, что эта папка находится в пути поиска DLL, когда требуется загрузить DLL.

0 голосов
/ 27 июня 2012

У меня вчера была точно такая же проблема.Программа запускается на моей машине, но не на других.На самом деле сообщение от Excel неверно.Он явно находит файл lhe dll, но эта dll вызывает orher dll, отсутствующую в системе: MSVCR100D.dll и NTDLL.dll. Я обнаружил, что с помощью свободного программного обеспечения Dependency Walker можно проверить, какая dll вызывается dll.

0 голосов
/ 21 мая 2011

Недавний разработчик предложил следующее исправление, которое позволяло регистрировать 32-битный .dll на 64-битном компьютере

1) Откройте командное окно DOS.

2) Перейдите в C: \ Windows \ Microsoft.NET \ Framework64 \ v2.0.50727

3) Введите следующее и нажмите ввод. regasm / codebase "C: \ Users \ myname \ Documents \ mydll.dll"

0 голосов
/ 20 мая 2011

Кажется, проблема в UAC.Попробуйте запустить скрипт VBA от имени администратора.Это может помочь вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...