在 Excel 32 位中使用动态路径加载 DLL

问题描述 投票:0回答:1

我目前正在尝试将具有动态路径的 dll (C++) 加载到我的 VBA 代码中。

我有两种不同的 dll,一种用于 32 位,一种用于 64 位。两个 dll 都工作正常,如果我声明 dll 的路径,我也可以使用两者(

Private Declare Function crypt Lib "C:\path\to\crypt32.dll" (ByVal inputs As String, ByVal intinput As Long) As String

)。

我已经用 .def 编译了 32 位 dll,因此我可以在没有别名的情况下正确调用它。

问题是,它仅适用于带有 64 位 dll 的 Excel 64 位,不适用于带有 32 位 dll 的 Excel 32 位。在创建 .def 之前,我也尝试过使用重整名称。

这是我的 VBA 代码,用于使用动态路径加载它:

#If Win64 Then
    Private Declare PtrSafe Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
    Private Declare PtrSafe Function crypt Lib "crypt64.dll" (ByVal inputs As String, ByVal intinput As Long) As String
#Else
    Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
    Private Declare Function crypt Lib "crypt32.dll" (ByVal inputs As String, ByVal intinput As Long) As String
#End If

Public Function dllcheck() As Boolean

    Dim dllPath As String, dllPath2 As String, hModule As Long, hModule2 As Long

#If Win64 Then
    dllPath = ActiveSheet.Cells(1, 13).value & "\crypt64.dll"
#Else
    dllPath = ActiveSheet.Cells(1, 13).value & "\crypt32.dll"
#End If

    hModule = LoadLibrary(dllPath)
    
    If hModule = 0 Then
        MsgBox "Cannot find dll"
        dllcheck = False
        Exit Function
    End If

    dllcheck = True
End Function

Sub TestFunction()
    
    If Not dllcheck() Then Exit Sub

    Dim inputChar As String, shiftValue As Long, result As String, outputChar As String

    inputChar = "a"
    shiftValue = 1

    result = crypt(inputChar, shiftValue)
       
    MsgBox "Input: " & inputChar & vbNewLine & _
           "Shift: " & shiftValue & vbNewLine & _
           "Output: " & result, vbInformation, "Output"
End Sub

谢谢

编辑:

我在网络上使用它,所以我认为这应该是原因,因为像 ChDir 这样的其他东西也不起作用。我认为唯一的方法是实现CallWindowProc。我能够获取 Loadlibrary 和 GetProcAdress。我可以用 CallWindowProc 以这种方式连接到 dll 吗?

excel vba dll dllimport 32-bit
1个回答
0
投票

我自己解决了这个问题。在 Windows 上,已经有一个 Crypt32.dll。所以 vba 直接指向它......

© www.soinside.com 2019 - 2024. All rights reserved.