COMDllLoader.bas
上传用户:davilee3
上传日期:2015-04-22
资源大小:986k
文件大小:3k
源码类别:

浏览器

开发平台:

Visual Basic

  1. Attribute VB_Name = "modCOMDllLoader"
  2. '***************************************************************
  3. ' (c) Copyright 2000 Matthew J. Curland
  4. '
  5. ' This file is from the CD-ROM accompanying the book:
  6. ' Advanced Visual Basic 6: Power Techniques for Everyday Programs
  7. '   Author: Matthew Curland
  8. '   Published by: Addison-Wesley, July 2000
  9. '   ISBN: 0-201-70712-8
  10. '   http://www.PowerVB.com
  11. '
  12. ' You are entitled to license free distribution of any application
  13. '   that uses this file if you own a copy of the book, or if you
  14. '   have obtained the file from a source approved by the author. You
  15. '   may redistribute this file only with express written permission
  16. '   of the author.
  17. '
  18. ' This file depends on:
  19. '   References:
  20. '     VBoostTypes6.olb (VBoost Object Types (6.0))
  21. '     ObjCreate.olb (VBoost: Object Creation and Security)
  22. '   Files:
  23. '     FunctionDelegator.bas
  24. '   Minimal VBoost conditionals:
  25. '     None
  26. '   Conditional Compilation Values:
  27. '     FUNCTIONDELEGATOR_NOHEAP = 1 (optional)
  28. '
  29. ' This file is discussed in Chapter 7.
  30. '***************************************************************
  31. Option Explicit
  32. Private m_fInit As Boolean
  33. Public IID_IClassFactory_vbb As IID
  34. Public IID_IUnknown_vbb As IID
  35. Private m_FDDllGetClassObject As FunctionDelegator
  36. Private m_pCallDllGetClassObject As ICallDllGetClassObject
  37. Private m_FDDllCanUnloadNow As FunctionDelegator
  38. Private m_pCallDllCanUnloadNow As ICallDllCanUnloadNow
  39. Private Sub Init()
  40.     IID_IClassFactory_vbb = IIDFromString(strIID_IClassFactory)
  41.     IID_IUnknown_vbb = IIDFromString(strIID_IUnknown)
  42.     Set m_pCallDllGetClassObject = InitDelegator(m_FDDllGetClassObject)
  43.     Set m_pCallDllCanUnloadNow = InitDelegator(m_FDDllCanUnloadNow)
  44.     m_fInit = True
  45. End Sub
  46. Public Function GetDllClassObject(ByVal DllPath As String, CLSID As CLSID, hModDll As hInstance) As IClassFactory
  47.     If Not m_fInit Then Init
  48.     If hModDll = 0 Then
  49.         hModDll = LoadLibraryEx(DllPath, 0, LOAD_WITH_ALTERED_SEARCH_PATH)
  50.         If hModDll = 0 Then
  51.             Err.Raise &H80070000 + Err.LastDllError
  52.         End If
  53.     End If
  54.     m_FDDllGetClassObject.pfn = GetProcAddress(hModDll, "DllGetClassObject")
  55.     If m_FDDllGetClassObject.pfn = 0 Then
  56.         Err.Raise &H80070000 + Err.LastDllError
  57.     End If
  58.     Set GetDllClassObject = m_pCallDllGetClassObject.Call(CLSID, IID_IClassFactory_vbb)
  59. End Function
  60. Public Sub TestUnloadDll(hModDll As hInstance)
  61.     If hModDll Then
  62.         If Not m_fInit Then Init
  63.         m_FDDllCanUnloadNow.pfn = GetProcAddress(hModDll, "DllCanUnloadNow")
  64.         If m_FDDllCanUnloadNow.pfn = 0 Then
  65.             Err.Raise &H80070000 + Err.LastDllError
  66.         End If
  67.         If m_pCallDllCanUnloadNow.Call = 0 Then
  68.             FreeLibrary hModDll
  69.             hModDll = 0
  70.         End If
  71.     End If
  72. End Sub