LoadLibrary не распознает PATH в коде VBA - PullRequest
0 голосов
/ 27 октября 2018

У меня есть DLL, и мне нужно вызвать ее, используя LoadLibrary("func1.dll").Полный путь к func1.dll опускается из LoadLibrary, потому что я должен установить переменную PATH в место, где находится func1.dll, поскольку func1.dll ссылается на другую DLL с именем func2.dll.

Итак, чтобы заставить это работать, я использую следующий код:

Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long
Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Private Declare Function SetEnvironmentVariable Lib "kernel32" Alias "SetEnvironmentVariableA" (ByVal lpName As String, ByVal lpValue As String) As Long

Private Sub t1()
    Dim lb As Long
    Dim dllpath As String

    dllpath = "C:\temp\DllsOffice\DLLsOffice\Debug"
    SetEnvironmentVariable "PATH", dllpath 
    Debug.Print Environ("PATH")

    lb = LoadLibrary("func1.dll")
    MsgBox lb   

    FreeLibrary lb
End Sub

, который прекрасно работает для VBA офисов 2007, 2010, 2013, 2016 и даже Office 2019. 32 и 64 бита.

Проблема возникает при записи приведенного выше кода в VBA Office, установленного из Магазина Microsoft: enter image description here

При запуске вышеуказанного кода VBA в Office из Магазина Microsoftстрока:

LoadLibrary("func1.dll")

возвращает 0, что означает, что DLL не была загружена.Итак, у меня закончились идеи, чтобы заставить это работать, но пока безуспешно.

Вот дополнительная информация о проблеме и о том, что я пытался сделать:

  1. Копирование DLL в путь к исполняемому файлу.Например, если я помещу func1.dllfunc2.dll) в C:\Program Files (x86)\Microsoft Office\Office14, я могу использовать LoadLibrary без необходимости использования SetEnvironmentVariable "PATH", dllpath.Но я не могу скопировать DLL по пути Office из Microsoft Store C:\Program Files\WindowsApps\Microsoft.Office.Desktop.Word_16040.10827.20181.0_x86__8wekyb3d8bbwe\Office16, потому что он дает доступ запрещен;

  2. Я полностью уверен, что SetEnvironmentVariable "PATH", dllpath работает нормально на Office из Microsoft Store,Я проверил это, поместив исполняемый файл в C:\temp\DllsOffice\DLLsOffice\Debug и затем вызвав Shell "test.exe" (без указания полного пути), моя программа test.exe открывается нормально.

Делай то, что я 'м отсутствует или есть какие-либо идеи для меня, чтобы следовать?Спасибо вам всем.

1 Ответ

0 голосов
/ 29 октября 2018

Мне удалось найти решение с помощью функции AddDllDirectory. Согласно веб-сайту Microsoft , функция AddDllDirectory:

Добавляет каталог в путь поиска DLL процесса.

Это означает, что в отличие от SetDllDirectory, который заменяет путь поиска DLL, AddDllDirectory работает как инкрементный путь поиска DLL. Итак, мой рабочий код может выглядеть примерно так:

Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long
Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Private Declare Function SetEnvironmentVariable Lib "kernel32" Alias "SetEnvironmentVariableA" (ByVal lpName As String, ByVal lpValue As String) As Long
Private Declare Function AddDllDirectory Lib "kernel32" (ByVal lpLibFileName As String) As Integer

Private Sub t1()
    Dim lb As Long
    Dim dllpath1 As String
    Dim dllpath2 As String
    Dim dllpathN As String

    dllpath1 = "C:\temp\DllsOffice\DLLsOffice\Debug1"
    dllpath2 = "C:\temp\OtherPath"
    dllpathN = "C:\temp\EvenOtherPath"
    AddDllDirectory (StrConv(dllpath1, vbUnicode))
    AddDllDirectory (StrConv(dllpath2, vbUnicode))
    AddDllDirectory (StrConv(dllpathN, vbUnicode))

    lb = LoadLibrary("func1.dll")  ' Success :)
    MsgBox lb   

    FreeLibrary lb
End Sub

OBS: хитрость с AddDllDirectory в VBA заключается в том, что не существует ни версии Ansi, ни Unicode этой функции, которая будет использоваться, как:

AddDllDirectoryA for Ansi 
AddDllDirectoryW for Unicode

Поэтому мне нужно было использовать функцию StrConv, чтобы явным образом преобразовать путь в формат Unicode.

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