从VBA调用GetProcAddress始终返回null

时间:2017-04-15 12:55:45

标签: vba dll getprocaddress

我有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;
    }
}

这个简单的函数可以由带有 no 问题的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

感激不尽的任何帮助。

1 个答案:

答案 0 :(得分:0)

您尽一切努力

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#整数,即4 + 4 = 8。

您还可以在VBA-land中省去twin \东西。

另请参阅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。

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