Как использовать DLL в той же директории, что и файл Excel - PullRequest
8 голосов
/ 09 июня 2009

Это как-то связано с моим другим вопросом .

Я использовал dll для создания таблицы Excel. В настоящее время все работает с DLL и Excel использует его просто отлично. Но можно ли указать, что dll находится в том же каталоге, что и файл excel, при объявлении функций?

Declare Sub FortranCall Lib "Fcall.dll" (r1 As Long, ByVal num As String)

К сожалению, это не работает, я должен использовать что-то вроде:

Declare Sub FortranCall Lib "C:\temp\Fcall.dll" (r1 As Long, ByVal num As String)

Это работает, но может вызвать головную боль при распространении среди моих офисных товарищей. Размещение dll в c: \ windows \ system32 и т. Д. На самом деле тоже не вариант.

Ответы [ 5 ]

3 голосов
/ 12 мая 2016

Я обычно об этом позабочусь, добавив:

Dim CurrentPath As String
CurrentPath = CurDir()   
ChDir (ThisWorkbook.Path)

Кому: Частный Sub Workbook_Open ()

3 голосов
/ 11 июня 2009

Вот три возможности для динамической загрузки / вызова в DLL из VBA, включая ссылки на соответствующую информацию и некоторый пример кода. Не могу сказать, что мне когда-либо приходилось использовать какое-либо из решений, описанных там, но это кажется разумным исследованием вариантов в свете потребности VBA в статическом пути.

  1. Создание нового модуля во время выполнения (вы можете импортировать файл .bas с диска, не нужно жестко кодировать модуль со строковыми литералами), используя API расширяемости VBIDE. Недостаток: нет проверки во время компиляции; вам нужно будет использовать строковые Application.Run вызовы для его вызова. Требуется надежный программный доступ к API VBIDE (т.е. вы разрешаете VBA выполнять код, который генерирует код, который затем выполняется ... как это делают макровирусы).
  2. Используйте LoadLibrary Win32 API ... и теперь у вас есть указатели и адреса: этот страшный код (загрузка в ZIP-формате) по сути является огромным не поддерживаемым хаком, который использует язык ассемблера для включения вызова API функционирует по имени. Похоже, что он работает только для подмножества поддерживаемых функций Win32 API.
  3. Измените путь поиска в DLL, но для этого также требуется динамический код, добавляемый во время выполнения, что вполне может соответствовать приведенному выше.

Вот другое потенциальное решение , которое предлагает программно обновить переменную среды PATH перед вызовом в вашу DLL. Неплохая идея, если это сработает, так как вы можете добавить это к своему событию открытия рабочей книги.

Удачи!

1 голос
/ 10 апреля 2014

ChDir () должен сделать свое дело. Это может не работать с сетевыми папками.

Declare Sub FortranCall Lib "Fcall.dll" (r1 As Long, ByVal num As String)
...
Dim CurrentPath As String
CurrentPath = CurDir()   
ChDir (ThisWorkbook.Path)
Call FortranCall(r, n)
ChDir (CurrentPath) ' Change back to original directory

Теперь сохраните .dll в той же папке, что и ваша книга.

0 голосов
/ 09 июня 2009

ActiveWorkbook.Path дает вам полный путь к папке, содержащей текущую активную книгу Итак, попробуйте это:

Declare Sub FortranCall Lib ActiveWorkbook.Path & "\Fcall.dll" (r1 As Long, ByVal num As String)
0 голосов
/ 09 июня 2009

Вы можете поместить DLL в какой-то каталог и добавить его в путь EnVar.

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