代码之家  ›  专栏  ›  技术社区  ›  gobansaor

SQLite UDF-VBA回调

  •  4
  • gobansaor  · 技术社区  · 17 年前

    是否有人试图将VBA(或VB6)函数(通过AddressOf?)传递给SQLite创建UDF函数( http://www.sqlite.org/c3ref/create_function.html ).

    VBA将如何处理生成的回调参数?

    空虚(

    1 回复  |  直到 14 年前
        1
  •  6
  •   rpetrich    17 年前

    不幸的是,不能直接使用VB6/VBA函数作为回调函数,因为VB6只生成 stdcall 功能而不是 cdecl SQLite需要的函数。

    您需要编写一个C dll来来回代理调用,或者重新编译SQLite来支持您自己的自定义扩展。

    重新编译dll以将函数导出为 ,您可以使用以下代码注册函数:

    'Create Function
    Public Declare Function sqlite3_create_function Lib "SQLiteVB.dll" (ByVal db As Long, ByVal zFunctionName As String, ByVal nArg As Long, ByVal eTextRep As Long, ByVal pApp As Long, ByVal xFunc As Long, ByVal xStep As Long, ByVal xFinal As Long) As Long
    
    'Gets a value
    Public Declare Function sqlite3_value_type Lib "SQLiteVB.dll" (ByVal arg As Long) As SQLiteDataTypes    'Gets the type
    Public Declare Function sqlite3_value_text_bstr Lib "SQLiteVB.dll" (ByVal arg As Long) As String        'Gets as String
    Public Declare Function sqlite3_value_int Lib "SQLiteVB.dll" (ByVal arg As Long) As Long                'Gets as Long
    
    'Sets the Function Result
    Public Declare Sub sqlite3_result_int Lib "SQLiteVB.dll" (ByVal context As Long, ByVal value As Long)
    Public Declare Sub sqlite3_result_error_code Lib "SQLiteVB.dll" (ByVal context As Long, ByVal value As Long)
    
    Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (dest As Any, source As Any, ByVal bytes As Long)
    
    Public Property Get ArgValue(ByVal argv As Long, ByVal index As Long) As Long
        CopyMemory ArgValue, ByVal (argv + index * 4), 4
    End Property
    
    Public Sub FirstCharCallback(ByVal context As Long, ByVal argc As Long, ByVal argv As Long)
        Dim arg1 As String
        If argc >= 1 Then
            arg1 = sqlite3_value_text_bstr(ArgValue(argv, 0))
            sqlite3_result_int context, AscW(arg1)
        Else
            sqlite3_result_error_code context, 666
        End If
    End Sub
    
    Public Sub RegisterFirstChar(ByVal db As Long)
        sqlite3_create_function db, "FirstChar", 1, 0, 0, AddressOf FirstCharCallback, 0, 0
        'Example query: SELECT FirstChar(field) FROM Table
    End Sub
    
    推荐文章