This is a quick simple test for a procedure in a DLL using LoadLibrary() and GetProcAddress(). Command line arguments are the DLL name, (user32.dll) and the procedure name to test if it is available.
testdll user32.dll MessageBoxA
Note that you must specify the ANSI or UNICODE suffix as the procedure name or you will get an error not found.
; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
include \masm32\include64\masm64rt.inc
.code
; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
entry_point proc
USING r12,r13
LOCAL parr :QWORD
LOCAL acnt :QWORD
LOCAL hLib :QWORD
LOCAL pproc :QWORD
SaveRegs
; --------------------------------------------
; get command line pointer array and arg count
; --------------------------------------------
CmdBegin parr,acnt ; start here
; -----------------------------------
; loop through command tail arguments
; -----------------------------------
mov r12, parr ; load array pointer into r12
mov r13, acnt ; load argument count into r13
lpst:
add r12, 8 ; add 8 to get next array member
sub r13, 1 ; decrement the argument counter
jnz lpst ; loop back if not zero
cmp acnt, 2
je @F
conout "Incorrect argument count",lf
jmp bye
@@:
mov r12, parr ; reload array pointer
conout "DLL name = ",QWORD PTR [r12],lf
conout "Proc name = ",QWORD PTR [r12+8],lf
rcall LoadLibrary,QWORD PTR [r12] ; test if DLL is valid
mov hLib, rax
test rax, rax
jne @F
conout "DLL name not found",lf
jmp bye
@@:
conout "DLL address = ",str$(hLib),lf
rcall GetProcAddress,hLib,QWORD PTR [r12+8] ; test if procedure is in the DLL
mov pproc, rax
test rax, rax
jne @F
conout "Proc name not found",lf
jmp bye
@@:
conout "Proc address = ",str$(pproc),lf
bye:
; ------------------------------
; free cmd arg processing memory
; ------------------------------
CmdEnd ; end here
RestoreRegs
.exit
entry_point endp
; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
end