문제

누구든지 VBA(또는 VB6) 함수(AddressOf를 통해?)를 SQLite에 전달하여 UDF 함수(http://www.sqlite.org/c3ref/create_function.html).

결과 콜백 인수는 VBA에서 어떻게 처리됩니까?

호출할 함수에는 다음과 같은 서명이 있습니다.

무효의 (xFunc)(sqlite3_context,int,sqlite3_value**)

도움이 되었습니까?

해결책

불행히도 VB6은 VB6/VBA 함수를 콜백으로 직접 사용할 수 없습니다. stdcall 기능보다는 cdecl SQLite가 기대하는 기능.

호출을 앞뒤로 프록시하기 위해 C dll을 작성하거나 사용자 정의 확장을 지원하기 위해 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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top