home *** CD-ROM | disk | FTP | other *** search
/ Planet Source Code Jumbo …e CD Visual Basic 1 to 7 / 5_2007-2008.ISO / data / Zips / Stream_MP32029381162006.psc / DynamicLinkLibrary.cls < prev    next >
Text File  |  2006-11-06  |  6KB  |  246 lines

  1. VERSION 1.0 CLASS
  2. BEGIN
  3.   MultiUse = -1  'True
  4.   Persistable = 0  'NotPersistable
  5.   DataBindingBehavior = 0  'vbNone
  6.   DataSourceBehavior  = 0  'vbNone
  7.   MTSTransactionMode  = 0  'NotAnMTSObject
  8. END
  9. Attribute VB_Name = "DynamicLinkLibrary"
  10. Attribute VB_GlobalNameSpace = False
  11. Attribute VB_Creatable = True
  12. Attribute VB_PredeclaredId = False
  13. Attribute VB_Exposed = False
  14. Option Explicit
  15.  
  16. ' dynamically load DLLs and call their exports with
  17. ' either stdcall or cdecl calling convention
  18.  
  19. Private Declare Function CallWindowProc Lib "user32" _
  20. Alias "CallWindowProcA" ( _
  21.     ByVal lpPrevWndFunc As Long, _
  22.     ByVal hWnd As Long, _
  23.     ByVal Msg As Long, _
  24.     ByVal wParam As Long, _
  25.     ByVal lParam As Long _
  26. ) As Long
  27.  
  28. Private Declare Function LoadLibrary Lib "kernel32" _
  29. Alias "LoadLibraryA" ( _
  30.     ByVal lpLibFileName As String _
  31. ) As Long
  32.  
  33. Private Declare Function FreeLibrary Lib "kernel32" ( _
  34.     ByVal hModule As Long _
  35. ) As Long
  36.  
  37. Private Declare Function GetProcAddress Lib "kernel32" ( _
  38.     ByVal hModule As Long, _
  39.     ByVal lpProcName As String _
  40. ) As Long
  41.  
  42. Private Declare Sub CpyMem Lib "kernel32" _
  43. Alias "RtlMoveMemory" ( _
  44.     pDst As Any, _
  45.     pSrc As Any, _
  46.     ByVal dwLen As Long _
  47. )
  48.  
  49. Private hMod        As Long
  50. Private blnIsCDECL  As Boolean
  51.  
  52. Public Property Get ModuleHandle( _
  53. ) As Long
  54.  
  55.     ModuleHandle = hMod
  56. End Property
  57.  
  58. Public Property Get IsCDECL( _
  59. ) As Boolean
  60.  
  61.     IsCDECL = blnIsCDECL
  62. End Property
  63.  
  64. Public Property Let IsCDECL( _
  65.     bln As Boolean _
  66. )
  67.  
  68.     blnIsCDECL = bln
  69. End Property
  70.  
  71. Public Sub UnloadDLL()
  72.     FreeLibrary hMod
  73.     hMod = 0
  74. End Sub
  75.  
  76. Public Function LoadDLL( _
  77.     ByVal strDLL As String _
  78. ) As Boolean
  79.  
  80.     blnIsCDECL = False
  81.     hMod = LoadLibrary(strDLL)
  82.     LoadDLL = hMod <> 0
  83. End Function
  84.  
  85. Public Function CallFunc( _
  86.     ByVal fnc As String, _
  87.     ParamArray args() As Variant _
  88. ) As Long
  89.  
  90.     Dim hFnc    As Long
  91.  
  92.     hFnc = GetProcAddress(hMod, fnc)
  93.     If hFnc = 0 Then
  94.         Err.Raise 1, , "Export not found!"
  95.         Exit Function
  96.     End If
  97.  
  98.     If Not IsCDECL Then
  99.         CallFunc = CallStd(hFnc, args)
  100.     Else
  101.         CallFunc = CallCdecl(hFnc, args)
  102.     End If
  103. End Function
  104.  
  105. Private Function CallStd( _
  106.     ByVal fnc As Long, _
  107.     ParamArray Params() As Variant _
  108. ) As Long
  109.  
  110.     Dim udtMem              As Memory
  111.     Dim pASM                As Long
  112.     Dim i                   As Integer
  113.  
  114.     If fnc = 0 Then
  115.         Err.Raise 255, , "Null Pointer called!"
  116.     End If
  117.  
  118.     udtMem = AllocMemory(1024, , PAGE_EXECUTE_READWRITE)
  119.     pASM = udtMem.address
  120.  
  121.     AddByte pASM, &H58                  ' POP EAX
  122.     AddByte pASM, &H59                  ' POP ECX
  123.     AddByte pASM, &H59                  ' POP ECX
  124.     AddByte pASM, &H59                  ' POP ECX
  125.     AddByte pASM, &H59                  ' POP ECX
  126.     AddByte pASM, &H50                  ' PUSH EAX
  127.  
  128.     If UBound(Params) = 0 Then
  129.         If IsArray(Params(0)) Then
  130.             For i = UBound(Params(0)) To 0 Step -1
  131.                 AddPush pASM, CLng(Params(0)(i))    ' PUSH dword
  132.             Next
  133.         Else
  134.             For i = UBound(Params) To 0 Step -1
  135.                 AddPush pASM, CLng(Params(i))       ' PUSH dword
  136.             Next
  137.         End If
  138.     Else
  139.         For i = UBound(Params) To 0 Step -1
  140.             AddPush pASM, CLng(Params(i))           ' PUSH dword
  141.         Next
  142.     End If
  143.  
  144.     AddCall pASM, fnc                   ' CALL rel addr
  145.     AddByte pASM, &HC3                  ' RET
  146.  
  147.     CallStd = CallWindowProc(udtMem.address, _
  148.                              0, 0, 0, 0)
  149.  
  150.     FreeMemory udtMem
  151. End Function
  152.  
  153. ' http://pscode.com/vb/scripts/ShowCode.asp?txtCodeId=62014&lngWId=1
  154. Private Function CallCdecl( _
  155.     ByVal lpfn As Long, _
  156.     ParamArray args() As Variant _
  157. ) As Long
  158.  
  159.     Dim udtMem              As Memory
  160.     Dim pASM                As Long
  161.     Dim i                   As Integer
  162.     Dim btArgSize           As Byte
  163.  
  164.     If lpfn = 0 Then
  165.         Err.Raise 255, , "Null Pointer called!"
  166.     End If
  167.  
  168.     udtMem = AllocMemory(1024, , PAGE_EXECUTE_READWRITE)
  169.     pASM = udtMem.address
  170.  
  171.     If UBound(args) = 0 Then
  172.         If IsArray(args(0)) Then
  173.             For i = UBound(args(0)) To 0 Step -1
  174.                 AddPush pASM, CLng(args(0)(i))    ' PUSH dword
  175.                 btArgSize = btArgSize + 4
  176.             Next
  177.         Else
  178.             For i = UBound(args) To 0 Step -1
  179.                 AddPush pASM, CLng(args(i))       ' PUSH dword
  180.                 btArgSize = btArgSize + 4
  181.             Next
  182.         End If
  183.     Else
  184.         For i = UBound(args) To 0 Step -1
  185.             AddPush pASM, CLng(args(i))           ' PUSH dword
  186.             btArgSize = btArgSize + 4
  187.         Next
  188.     End If
  189.  
  190.     AddByte pASM, &HB8
  191.     AddLong pASM, lpfn
  192.     AddByte pASM, &HFF
  193.     AddByte pASM, &HD0
  194.     AddByte pASM, &H83
  195.     AddByte pASM, &HC4
  196.     AddByte pASM, btArgSize
  197.     AddByte pASM, &HC2
  198.     AddByte pASM, &H10
  199.     AddByte pASM, &H0
  200.  
  201.     CallCdecl = CallWindowProc(udtMem.address, _
  202.                                0, 0, 0, 0)
  203.  
  204.     FreeMemory udtMem
  205. End Function
  206.  
  207. Private Sub AddPush( _
  208.     pASM As Long, _
  209.     lng As Long _
  210. )
  211.  
  212.     AddByte pASM, &H68
  213.     AddLong pASM, lng
  214. End Sub
  215.  
  216. Private Sub AddCall( _
  217.     pASM As Long, _
  218.     addr As Long _
  219. )
  220.  
  221.     AddByte pASM, &HE8
  222.     AddLong pASM, addr - pASM - 4
  223. End Sub
  224.  
  225. Private Sub AddLong( _
  226.     pASM As Long, _
  227.     lng As Long _
  228. )
  229.  
  230.     CpyMem ByVal pASM, lng, 4
  231.     pASM = pASM + 4
  232. End Sub
  233.  
  234. Private Sub AddByte( _
  235.     pASM As Long, _
  236.     Bt As Byte _
  237. )
  238.  
  239.     CpyMem ByVal pASM, Bt, 1
  240.     pASM = pASM + 1
  241. End Sub
  242.  
  243. Private Sub Class_Terminate()
  244.     'UnloadDLL
  245. End Sub
  246.