SQLite UDF - VBA Callback

голоса
4

Кто - нибудь пытался передать функцию VBA (или VB6) (через AddressOf?) В SQLite создать UDF функции ( http://www.sqlite.org/c3ref/create_function.html ).

Как результирующие аргументы обратного вызова будет обрабатываться VBA?

Функция будет называться будет иметь следующий вид ...

недействительным ( xFunc) (sqlite3_context , INT, sqlite3_value **)

Задан 15/09/2008 в 17:07
источник пользователем
На других языках...                            


1 ответов

голоса
4

К сожалению, вы не можете использовать VB6 функцию / VBA в качестве обратного вызова непосредственно в VB6 генерирует только stdcallфункции , а не cdeclфункции SQLite ожидает.

Вам нужно будет написать DLL C для прокси вызовы туда и обратно или перекомпилировать SQLite, чтобы поддержать свой собственный внутренний номер.

После перекомпиляции библиотеки DLL экспортировать функции , как stdcall, вы можете зарегистрировать функцию с помощью следующего кода:

'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
Ответил 16/09/2008 в 07:07
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more