Quantcast
Channel: VBForums - CodeBank - Visual Basic 6 and earlier
Viewing all articles
Browse latest Browse all 1448

RC5 Sqlite Like Adodb.Connection/Adodb.RecordSet(WithOut Reg Com Dll)

$
0
0
Code:

Sub TestSqliteComDll()
    Dim Cnn As cConnection
    Set Cnn = New_cConnection
    MsgBox Cnn.Version
End Sub

Code:

Option Explicit
'免注册加载DLL-
''COM DLL可以放在当前目录或SysWOW64就能引用成功,
'C:\Windows\SysWOW64

'Set cn2 = CreateObjectXX("sqlite3.dll", ClsStr_Obj) '放在系统目录,可以不带路径
'Set cn2 = CreateObjectXX(ThisWorkbook.path & "\sqlite3.dll", ClsStr_Obj)
'DLL放在当前目录,要添加完整路径

Private Type UUID
    d1 As Long
    d2 As Integer
    d3 As Integer
    d4(7) As Byte
End Type

Private Declare Function CLSIDFromString Lib "ole32" (ByVal str As Long, id As UUID) As Long
Private Declare Function IIDFromString Lib "ole32" (ByVal str As Long, id As UUID) As Long

Private Declare Function DispCallFunc Lib "oleaut32.dll" (ByVal pvInstance As Long, ByVal offsetinVft As Long, ByVal CallConv As Long, ByVal retTYP As Integer, ByVal paCNT As Long, ByRef paTypes As Integer, ByRef paValues As Long, ByRef retVAR As Variant) As Long
Private Declare Function GetProcAddress Lib "kernel32.dll" (ByVal hModule As Long, ByVal lpProcName As String) As Long
Private Declare Function LoadLibrary Lib "kernel32.dll" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long

 Function New_cRecordset() As cRecordset
    Set New_cRecordset = CreateObjectXX(App.Path & "\dhRichClient3.dll", _
    "{351A3F14-5448-40A6-8E25-1F55A2CF989D}")
End Function


Function New_cConnection() As cConnection
    Set New_cConnection = CreateObjectXX(App.Path & "\dhRichClient3.dll", _
    "{6B16C696-FB30-42CE-827C-090956209CEC}")
End Function


Function CreateObjectXX(DllFileName As String, sCLSID As String, Optional ForIID_IDispatch As Boolean, Optional H As Long) As Object
'先声明对象真实类型才可以免注册加载COM DLL
    Const sIID_IClassFactory As String = "{00000001-0000-0000-C000-000000000046}"
    Const sIID_IDispatch As String = "{00020400-0000-0000-C000-000000000046}"
    Const sIID_IUnknown  As String = "{00000000-0000-0000-C000-000000000046}"
    Dim lCLSID As UUID, IID_IClassFactory As UUID, IID_IDispatch As UUID, IID_IUnknown As UUID

    Dim lOle As Object, fo As Object
    Dim FUNC As Long, ret As Variant, ty(2) As Integer, pm(2) As Long, vParams(2) As Variant
   
    IIDFromString StrPtr(sIID_IClassFactory), IID_IClassFactory
    IIDFromString StrPtr(sIID_IDispatch), IID_IDispatch
    IIDFromString StrPtr(sIID_IUnknown), IID_IUnknown
   
    CLSIDFromString StrPtr(sCLSID), lCLSID
    H = LoadLibrary(DllFileName)
    FUNC = GetProcAddress(H, "DllGetClassObject")
   
    ty(0) = vbLong
    ty(1) = vbLong
    ty(2) = vbObject
   
    vParams(0) = VarPtr(lCLSID)
    vParams(1) = VarPtr(IID_IClassFactory)
    vParams(2) = VarPtr(fo)
   
    pm(0) = VarPtr(vParams(0))
    pm(1) = VarPtr(vParams(1))
    pm(2) = VarPtr(vParams(2))
    Dim l As Long
    l = DispCallFunc(0&, FUNC, 4, vbObject, 3, ty(0), pm(0), ret)
   
   
  ' DispCallFunc ObjPtr(fo), 32, 1, vbLong, 0, 0, 0, ret
   

    If fo Is Nothing Then Exit Function
    vParams(0) = 0&
    If ForIID_IDispatch Then
        vParams(1) = VarPtr(IID_IDispatch) '一般的COM DLL可以用这个
    Else
        vParams(1) = VarPtr(IID_IUnknown) ' tlbinf32.dll只能用这个(默认就用这种方法)
    End If
    vParams(2) = VarPtr(lOle)
   
    DispCallFunc ObjPtr(fo), 12&, 4, vbObject, 3, ty(0), pm(0), ret
    Set CreateObjectXX = lOle
    Set fo = Nothing
    Set lOle = Nothing
End Function


Viewing all articles
Browse latest Browse all 1448

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>