AddressOf, Delegate and upgrade code from VB6

J Trahair

Well-known member
Joined
May 14, 2008
Messages
175
Location
Spain
Programming Experience
10+
Hi. I am converting some VB6 code to VB.Net - specifically callbacks.
VB6 code in Form_Load:
VB.NET:
Result = voRegisterMrzCallback(AddressOf MRZCallback, 0)
where Result is a boolean.

voRegisterMrzCallback declared as:
VB.NET:
Declare Function voRegisterMrzCallback Lib "videoocr" (ByVal CallbackFunction As Long, ByVal Parameter As Long) As Boolean

(In .Net, I changed all 'Long' to 'Integer'.)

In .Net the line 'Result = voRegisterMrzCallback(AddressOf MRZCallback, 0)' gives an error:
'AddressOf' expression cannot be converted to 'Integer' because 'Integer' is not a delegate type.

How does delegate fit into this? Thank you.
 
Here is a bit of quick reading... AddressOf Operator

Result = voRegisterMrzCallback(AddressOf MRZCallback, 0)

CallbackFunction parameter is declared as Long so its expecting a number not a delegate.

if MRZCallback returns or equals a number you can just do...

Result = voRegisterMrzCallback(MRZCallback, 0)
 
MRZCallback is defined as
VB.NET:
    Public Sub MRZCallback(ByVal Parameter As Integer, ByRef Data As VIDEOOCRMRZDATA)

        frmOCR.TextBox1.Text = Data.RawMRZ

    End Sub

It reads a passport scanner and returns the passport data.

VIDEOOCRMRZDATA is defined as
VB.NET:
    Public Structure VIDEOOCRMRZDATA
        Dim RawMRZ As String
        Dim DocumentNumber As String
        Dim DOB As String
        Dim Expiry As String
        Dim Issuer As String
        Dim Nationality As String
        Dim LastNames As String
        Dim FirstNames As String
        Dim Type As String
        Dim Discretionary1 As String
        Dim Discretionary2 As String
    End Structure

The error for Result = voRegisterMrzCallback(AddressOf MRZCallback, 0) is still
'AddressOf' expression cannot be converted to 'Integer' because 'Integer' is not a delegate type.

If I remove the 'AddressOf', the error is
Argument not specified for parameter 'Data' of 'Public Sub MRZCallback(Parameter As Integer, ByRef Data As modBFOCRNet.VIDEOOCRMRZDATA)'.
and
Argument not specified for parameter 'Parameter' of 'Public Sub MRZCallback(Parameter As Integer, ByRef Data As modBFOCRNet.VIDEOOCRMRZDATA)'.
 
Try changing:
VB.NET:
    Declare Function voRegisterMrzCallback Lib "videoocr" (ByVal CallbackFunction As Long, ByVal Parameter As Long) As Boolean

    Public Sub MRZCallback(ByVal Parameter As Integer, ByRef Data As VIDEOOCRMRZDATA)

        frmOCR.TextBox1.Text = Data.RawMRZ

    End Sub
To:
VB.NET:
    Declare Function voRegisterMrzCallback Lib "videoocr" (ByVal CallbackFunction As Integer, ByVal Parameter As Integer) As Boolean

    Public Function MRZCallback(ByVal Parameter As Integer, ByRef Data As VIDEOOCRMRZDATA) As Integer

        frmOCR.TextBox1.Text = Data.RawMRZ

        Return Parameter 'This is my guess, I haven't a clue what value to return

    End Function
 
Declare or use a delegate with a matching signature and use that delegate type as parameter. How to: Implement Callback Functions

callback method signature:
Public Sub MRZCallback(ByVal Parameter As Integer, ByRef Data As VIDEOOCRMRZDATA)

callback delegate type:
Public Delegate Sub Callback(ByVal Parameter As Integer, ByRef Data As VIDEOOCRMRZDATA)

API declare:
Declare Function voRegisterMrzCallback Lib "videoocr" (ByVal CallbackFunction As Callback, ByVal Parameter As Integer) As Boolean

API call:
Result = voRegisterMrzCallback(AddressOf MRZCallback, 0)

which is short for:
Result = voRegisterMrzCallback(New Callback(AddressOf MRZCallback), 0)
 
Back
Top