</p> 嘿,够简单吧!下面是动态调用MessageBoxA的源代码,上面的步骤被封装到RunDll32函数中,可放到模块(CallAPIbyName.bas)中:
3 {6 q( Z- l" D( Y5 [% _ Dim s1() As Byte, s2() As Byte
6 \: S: H a {* `+ D+ n; s Dim ret As Long4 }/ {2 B& N5 L6 N1 f, I8 p: w
s1 = StrConv("Hello~World", vbFromUnicode)
' z' ^; f8 t' y& H: ~* u Z s2 = StrConv("VBNote", vbFromUnicode)
4 s# s* ]6 b+ u' \( `" ]% ?1 S0 G, N ret = RunDll32("user32", "MessageBoxA", hwnd, VarPtr(s1(0)), VarPtr(s2(0)), 0&)
: q3 `) B, Q: g4 m CallAPIbyName.bas中的源代码:" r/ f6 c! ^; d, E+ D. X( p6 p0 b
Option Explicit
+ s8 t6 \$ n+ E, n C& M Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
4 R9 c' a0 H& q1 [9 R Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long8 N, Y6 D: p# Z( e
Private Declare Function CallWindowProc Lib "User32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
$ u5 _6 B$ k$ [- Z7 }2 d Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long: s8 J# r D. k
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (lpDest As Any, lpSource As Any, ByVal cBytes As Long)
g2 Y1 w/ Q, i d T8 A$ g# o X [ Public m_opIndex As Long ′写入位置
. e! @9 c7 O+ |6 [1 h Private m_OpCode() As Byte ′Assembly 的OPCODE
/ D4 f6 Z/ D# N2 z Public Function RunDll32(LibFileName As String, ProcName As String, ParamArray Params()) As Long
# ?4 r& r: Q" o) e% E3 L Dim hProc As Long `" y3 k6 w$ C9 ?
Dim hModule As Long/ n. h. }2 ^- n0 i9 W
ReDim m_OpCode(400 + 6 * UBound(Params)) ′保留用来写m_OpCode
7 I% A6 l2 [( I+ S8 L( d e1 B ′读取API库% S/ }+ V7 b; m- C1 ~; U
hModule = LoadLibrary(ByVal LibFileName)
5 z! v; z+ C; ^: b8 c If hModule = 0 Then0 M3 {# g! M- H4 l7 |
MsgBox "Library读取失败!"
2 v0 |3 x# v/ q Exit Function! j0 e" e7 ]9 O% C6 ~- s" o
End If. I/ J% e3 h# n$ p/ u/ C
′取得函数地址( ^+ g g& s6 @- d+ o5 d* b1 O
hProc = GetProcAddress(hModule, ByVal ProcName)
4 o. { d" B% D8 m8 r, P If hProc = 0 Then
6 R: Q# G, m: u: H+ r MsgBox "函数读取失败!", vbCritical0 Y6 ?7 M7 r ~& Z3 ?- r
FreeLibrary hModule
) @$ B7 V" \2 f Exit Function/ f5 m! s4 a* ~5 G* f1 m; ?
End If |