Public Function CallApiByName(ByVal sLib As String, ByVal sMod As String, ParamArray Params()) As Long
Dim bvASM(64) As Byte 'enought to hold code + 10 params
Dim i As Long
Dim lPos As Long
Dim sVal As String
bvASM(0) = &H58: bvASM(1) = &H59: bvASM(2) = &H59
bvASM(3) = &H59: bvASM(4) = &H59: bvASM(5) = &H50
lPos = 6
For i = UBound(Params) To 0 Step -1
bvASM(lPos) = &H68: lPos = lPos + 1
sVal = (Params(i)): GoSub PutLong: lPos = lPos + 4
Next
bvASM(lPos) = &HE8: lPos = lPos + 1
sVal = GetProcAddress(LoadLibraryA(sLib), sMod) - VarPtr(bvASM(lPos)) - 4
GoSub PutLong: lPos = lPos + 4
bvASM(lPos) = &HC3
CallApiByName = CallWindowProcA(VarPtr(bvASM(0)), 0, 0, 0, 0)
Exit Function
PutLong:
'This is cheap replacement for RtlMoveMemory/putmem4 (hi/lo word/byte)
sVal = Right$(String(8, "0") & Hex(sVal), 8)
bvASM(lPos + 0) = ("&h" & Mid$(sVal, 7, 2))
bvASM(lPos + 1) = ("&h" & Mid$(sVal, 5, 2))
bvASM(lPos + 2) = ("&h" & Mid$(sVal, 3, 2))
bvASM(lPos + 3) = ("&h" & Mid$(sVal, 1, 2))
Return
End Function
ودي بشرح مفصل لها
والف شكرا مقدما