原帖:http://blog.csdn.net/Modest/archive/2007/09/01/1767950.aspx
使用方法:
Dim pDll As Long '記錄Dll,用來最後完美釋放<br />Dim Update As Update.Handle '要執行個體化的對象<br />Set Update = LoadObjectByName(App.Path & "/Update.dll", "Handle", pDll) ' New Update.Handle<br />If Update Is Nothing Then Exit Sub<br />Update.Test '<--類中的方法<br />Set Update = Nothing '<-----這句不能少,否則會出現意外錯誤<br />UnLoadDll pDll '<----釋放
模組中:
Option Explicit<br />Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryW" (ByVal lpLibFileName As Long) As Long<br />Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long<br />Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long<br />Private Declare Function CallAsmCode Lib "user32" Alias "CallWindowProcW" (FirstAsmCode As Long, ByVal pA As Long, ByVal pB As Long, ByVal pC As Long, lpD As Long) As Long<br />Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)<br />Private AsmCode(94) As Long<br />Public Function LoadObjectByName(ByVal DllPath As String, ByVal ClsName As String, pDll As Long) As Object<br /> Dim pObj As Long, TLIAPP As Object, TLI As Object<br /> Dim CLSID As String, IID As String, IIDName As String<br /> On Error GoTo Err<br /> Set TLIAPP = CreateObject("TLI.TLIApplication")<br /> Set TLI = TLIAPP.TypeLibInfoFromFile(DllPath)<br /> IIDName = "_" & Trim(ClsName)<br /> CLSID = TLI.GetTypeInfo(Trim(ClsName)).GUID<br /> IID = TLI.GetTypeInfo(Trim(IIDName)).GUID<br /> Set LoadObjectByName = LoadObjectByID(DllPath, CLSID, IID, pDll)<br /> Set TLI = Nothing<br />Err:<br />End Function<br />Public Function LoadObjectByID(ByVal DllPath As String, ByVal CLSID As String, ByVal IID As String, pDll As Long) As Object<br /> Dim pObj As Long<br /> Call InitAsmCode<br /> pObj = CallAsmCode(AsmCode(20), StrPtr(DllPath), StrPtr(CLSID), StrPtr(IID), pDll)<br /> CopyMemory LoadObjectByID, pObj&, 4&<br />End Function<br />Public Function UnLoadDll(pDll As Long) As Long<br /> Call InitAsmCode<br /> UnLoadDll = CallAsmCode(AsmCode(79), pDll, 0, 0, 0)<br />End Function<br />Private Sub InitAsmCode()<br /> If AsmCode(4) Then Exit Sub<br /> Dim pDll As Long<br /> pDll = LoadLibrary(StrPtr("kernel32"))<br /> AsmCode(0) = GetProcAddress(pDll, "LoadLibraryW")<br /> AsmCode(1) = GetProcAddress(pDll, "GetProcAddress")<br /> AsmCode(2) = GetProcAddress(pDll, "FreeLibrary")<br /> Call FreeLibrary(pDll)<br /> AsmCode(4) = &H476C6C44<br /> AsmCode(5) = &H6C437465<br /> AsmCode(6) = &H4F737361<br /> AsmCode(7) = &H63656A62<br /> AsmCode(8) = &H4C430074<br /> AsmCode(9) = &H46444953<br /> AsmCode(10) = &H536D6F72<br /> AsmCode(11) = &H6E697274<br /> AsmCode(12) = &H10067<br /> AsmCode(13) = &H0&<br /> AsmCode(14) = &HC00000<br /> AsmCode(15) = &H0&<br /> AsmCode(16) = &H6F4600<br /> AsmCode(17) = &H65006C<br /> AsmCode(18) = &H320033<br /> AsmCode(19) = &H0&<br /> AsmCode(20) = &H83EC8B55 '建立對象函數入口<br /> AsmCode(21) = &HE853D8C4<br /> AsmCode(22) = &H0&<br /> AsmCode(23) = &H6CEB815B<br /> AsmCode(24) = &H8D100010<br /> AsmCode(25) = &H105293<br /> AsmCode(26) = &H93FF5210<br /> AsmCode(27) = &H10001010<br /> AsmCode(28) = &H32938D50<br /> AsmCode(29) = &H52100010<br /> AsmCode(30) = &H1493FF50<br /> AsmCode(31) = &H8D100010<br /> AsmCode(32) = &H101C93<br /> AsmCode(33) = &HFF028910<br /> AsmCode(34) = &H101893<br /> AsmCode(35) = &H875FF10<br /> AsmCode(36) = &H101093FF<br /> AsmCode(37) = &HC00B1000<br /> AsmCode(38) = &H86840F<br /> AsmCode(39) = &H45890000<br /> AsmCode(40) = &H20938DFC<br /> AsmCode(41) = &H52100010<br /> AsmCode(42) = &H1493FF50<br /> AsmCode(43) = &HB100010<br /> AsmCode(44) = &H506674C0<br /> AsmCode(45) = &H52EC558D<br /> AsmCode(46) = &HFF0C75FF<br /> AsmCode(47) = &H101C93<br /> AsmCode(48) = &H558D5810<br /> AsmCode(49) = &H938D52D8<br /> AsmCode(50) = &H10001042<br /> AsmCode(51) = &HEC558D52<br /> AsmCode(52) = &HBD0FF52<br /> AsmCode(53) = &H8D3E75C0<br /> AsmCode(54) = &HFF52DC55<br /> AsmCode(55) = &H93FF1075<br /> AsmCode(56) = &H1000101C<br /> AsmCode(57) = &HD8558B50<br /> AsmCode(58) = &H8D54128B<br /> AsmCode(59) = &H6A50DC45<br /> AsmCode(60) = &HD875FF00<br /> AsmCode(61) = &HB0C52FF<br /> AsmCode(62) = &H8B1575C0<br /> AsmCode(63) = &H4D8BFC45<br /> AsmCode(64) = &H59018914<br /> AsmCode(65) = &H8BD18B51<br /> AsmCode(66) = &H52FF5112<br /> AsmCode(67) = &H14EB5804<br /> AsmCode(68) = &HEB06EB58<br /> AsmCode(69) = &HEB02EB0F<br /> AsmCode(70) = &HFC75FF0B<br /> AsmCode(71) = &H101893FF<br /> AsmCode(72) = &HC0331000<br /> AsmCode(73) = &H10C2C95B<br /> AsmCode(74) = &H6C6C4400<br /> AsmCode(75) = &H556E6143<br /> AsmCode(76) = &H616F6C6E<br /> AsmCode(77) = &H776F4E64<br /> AsmCode(78) = &H0&<br /> AsmCode(79) = &H53EC8B55 '嘗試卸載DLL函數入口<br /> AsmCode(80) = &HE8&<br /> AsmCode(81) = &HEB815B00<br /> AsmCode(82) = &H10001155<br /> AsmCode(83) = &H1139938D<br /> AsmCode(84) = &HFF521000<br /> AsmCode(85) = &H93FF0875<br /> AsmCode(86) = &H10001014<br /> AsmCode(87) = &H1374C00B<br /> AsmCode(88) = &HC00BD0FF<br /> AsmCode(89) = &H75FF0E74<br /> AsmCode(90) = &H1893FF08<br /> AsmCode(91) = &H33100010<br /> AsmCode(92) = &H4801EBC0<br /> AsmCode(93) = &H10C2C95B<br /> AsmCode(94) = &H90909000<br />End Sub