【问题标题】:Calling GetProcAddress from VBA always returns null从 VBA 调用 GetProcAddress 总是返回 null
【发布时间】:2017-04-15 12:55:45
【问题描述】:

我有 64 位 Windows 10 和 MS Office 64 位。 我正在尝试让 Powerpoint 的 VBA 加载和执行自写的 64 位 Windows DLL 中的函数。 为了防止导出名称损坏,我使用了 extern C:

extern "C" {
    __declspec(dllexport) long jaadd(long a, long b)
    {
        return a + b;
    }
}

这个简单的函数可以被 C++ 模块调用,没有问题:

    hinstDLL = LoadLibrary(L"D:\\Visual Studio 2017\\Projects\\PopUpDLL\\x64\\Debug\\PopUpDLL.dll");
    if (hinstDLL != NULL)
    {
        jaadd = (AddFunc)GetProcAddress(hinstDLL, "jaadd");
        if (jaadd != NULL) {
            result = jaadd(13, 40);
        }       
        fFreeDLL = FreeLibrary(hinstDLL);
    }

尝试在 Powerpoint 中从 VBA 调用 DLL 时出现问题。 GetProcAddress 总是返回零,FreeLibrary 也是如此

    Private Declare PtrSafe Function FreeLibrary Lib "kernel32" (ByVal      hLibModule As Long) As LongLong
    Private Declare PtrSafe Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
    Private Declare PtrSafe Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long
    Private hLib As Long
    Sub LLib()
        hLib = LoadLibrary("D:\\Visual Studio 2017\\Projects\\PopUpDLL\\x64\\Debug\\PopUpDLL.dll")
        MsgBox hLib
        Dim pprocaddress As Long
        pprocaddress = GetProcAddress(hLib, "jaadd")  ***** always returns 0
        MsgBox pprocaddress
        xx = FreeLibrary(hLib)  ***** always returns 0
        MsgBox xx
    End Sub

感谢您的任何帮助。

【问题讨论】:

  • 尝试将 pprocaddress 作为 LongPtr。我认为与 hLib 相同。
  • Declare 语句错误,句柄是 LongPtr。
  • 谢谢你们俩。这确实使事情奏效。许多网站在其 DECLARE 语句中都有 LoadLibrary 的句柄,并将 GetProcAddress 返回为 Long 而不是 LongPtr。

标签: vba dll getprocaddress


【解决方案1】:

你都试过了吗

Private Declare PtrSafe Function jaadd Lib "......\x64\Debug\PopUpDLL.dll" 
Alias "_jaadd@8" (ByVal arg1 As Long, ByVal arg2 as Long) As Long

注意别名修改“算法”:_ + 您的原始名称 + @ + 参数字节的总和。

您有两个 VBA Long,或两个 C# int,4 + 4 = 8。

您也可以在 VBA-land 中省去孪生 \ 的东西。

另见https://docs.microsoft.com/en-us/office/client-developer/excel/how-to-access-dlls-in-excel

最后,确保对 32 位 VBA 使用 32 位 DLL,对 64 位 VBA 使用 64 位 DLL。

许多网站在其 DECLARE 语句中都有 LoadLibrary 的句柄,并将 GetProcAddress 返回为 Long 而不是 LongPtr。

问题在于信息已过时 - 代码从未更新以反映 VBA 的 Excel 2009 后状态。

【讨论】:

  • 感谢您的评论和网页链接。上面的两个 cmets 确实帮助了我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-11
  • 1970-01-01
  • 2017-11-29
  • 2014-03-04
  • 2016-11-02
相关资源
最近更新 更多