Search notes:

Accessing DLLs from VBA: byVal vs byRef - as longPtr vs as any

This is the result of a few little experiments that I conducted to find out how declaring parameters for a DLL as byVal / byRef and as longPtr / as any influence the values that are passed to the DLL.
Parameter byVal p longPtr byRef p as longPtr byVal p as any byRef p as any
varLong varLong varPtr(varLong) varLong varPtr(varLong)
strPtr(varString) strPtr(varString) ? strPtr(varString) ?
varPtr(varString) varPtr(varString) ? varPtr(varString) ?
vbNull 1 ? 1 ?
vbNullString type mismatch type mismatch 0 ?

The source for the DLL

#include <windows.h>

__declspec(dllexport) void __stdcall fourLongs(long a, long b, long c, long d) {

    char buf[200];
    wsprintf(buf, "a = %d\nb = %d\nc = %d\ne = %d", a, b, c, d);
    MessageBox(0, buf, "fourLongs", 0);

}
Github repository VBA-calls-DLL, path: /c/fourLongs.c

The VBA source that calls the DLL

option explicit

declare sub fourLongs                                    _
        lib "c:\github\VBA-calls-DLL\c\fourLongs.dll" (  _
               byVal a as longPtr                     ,  _
               byRef b as longPtr                     ,  _
               byVal c as any                         ,  _
               byRef d as any                         )

sub main() ' {

    dim varLong   as long
    dim varString as string

    varLong   = 42
    varString ="Hello world"

    debug.print "varPtr(varLong)   = " & varPtr(varLong  )
    debug.print "varPtr(varString) = " & varPtr(varString)
    debug.print "strPtr(varString) = " & strPtr(varString)

    fourLongs        varLong   ,        varLong   ,        varLong   ,        varLong
    fourLongs strPtr(varString), strPtr(varString), strPtr(varString), strPtr(varString)
    fourLongs varPtr(varString), varPtr(varString), varPtr(varString), varPtr(varString)
    fourLongs vbNull           , vbNull           , vbNull           , vbNull
    fourLongs vbNull           , vbNull           , vbNullString     , vbNullString

end sub ' }
Github repository VBA-calls-DLL, path: /fourLongs.bas

See also

Accessing and calling DLLs from VBA (Visual Basic for Applications)

Index