Still celebrating National IT Professionals Day with 3 months of free Premium Membership. Use Code ITDAY17

x
?
Solved

C++ DLL callback with VB.Net

Posted on 2008-06-25
7
Medium Priority
?
1,369 Views
Last Modified: 2013-11-07
Hi there,
         i have a unmanaged  DLL that I use to control a Biometric reader with my app. I'm coding with VB.net. I used a vb6 example to interface with the DLL. Here is the original code to link with the dll function :

Public Declare Function AET60_SetCallback Lib "Librairie externe\AET60.dll" ( _
    ByVal CallbackFunction As Long) As Long

Here is the new one in vb.net :

<DllImport("Librairie externe\AET60.dll", EntryPoint:="AET60_SetCallback", _
        SetLastError:=True, CallingConvention:=CallingConvention.Cdecl)> _
        Public Shared Function AET60_SetCallback(ByVal CallbackFunction As MyCallBack) As Integer
    End Function

Here is my delegate :

<UnmanagedFunctionPointer(CallingConvention.Cdecl)> _
    Public Delegate Function MyCallBack(ByRef Param As Integer, _
                                  ByVal GuiState As Integer, _
                                  ByVal Response As Byte, _
                                  ByVal Msg As Integer, _
                                  ByVal Progress As Byte, _
                                  ByRef SampleBuffer As FBITMAP) As Integer

And my callback function :

Private Function CALLBACK_FUNCTION(ByRef Param As Integer, _
                                      ByVal GuiState As Integer, _
                                      ByVal Response As Byte, _
                                      ByVal Msg As Integer, _
                                      ByVal Progress As Byte, _
                                      ByRef SampleBuffer As FBITMAP) As Integer

        Dim StatusMsg As String
        StatusMsg = New String(vbNullChar, 255)

        If (GuiState And AET60_MESSAGE_PROVIDED) <> 0 Then
            Call AET60_GetMessage(Msg, StatusMsg)
        End If
        CALLBACK_FUNCTION = 0

    End Function



The data structure concerned by the declaration :

'======================================================================
    ' data structure definition
    '======================================================================
    Public Structure FDATA
        Dim Length As Integer
        Dim Data() As Byte
    End Structure

    Public Structure FBITMAP
        Dim Width As Integer
        Dim Height As Integer
        Dim Bitmap As FDATA
    End Structure


And the line where I plug everything :

        del = New MyCallBack(AddressOf CALLBACK_FUNCTION)
        retcode = AET60_SetCallback(del)


Everything runs smoothly until I call un dll function that should trigger the callback ... i then receive a "Unhandled exception of type 'System.ArgumentNullException' from a unknown module.

If i skip the callback regiostration, everything runs smoothly but i can't have sny status update on the status of my thuimbprint reader ...

Can anyone give me a hand ?

0
Comment
Question by:David MacDonald
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 4
  • 3
7 Comments
 
LVL 10

Expert Comment

by:Jason Evans
ID: 21867698
Hi Moonover.

This might be a long  shot, but maybe you should try this:

<DllImport("Librairie externe\AET60.dll", EntryPoint:="AET60_SetCallback", _
        SetLastError:=True, CallingConvention:=CallingConvention.Cdecl)> _
        Public Shared Function AET60_SetCallback(ByVal CallbackFunction As System.IntPtr) As Integer
    End Function

Use the IntPtr in the declaration. Then use the function like so:

        del = New MyCallBack(AddressOf CALLBACK_FUNCTION)
        retcode = AET60_SetCallback(del) or         retcode = AET60_SetCallback(AddressOf del)

If this doesn't work, try using ByRef instead of ByVal in the declaration of AET60_SetCallback.

Hope this helps.
Jas.
0
 
LVL 1

Author Comment

by:David MacDonald
ID: 21869816
Hi, i just tried it ... it tells me that the type MyCalllBack cannot be converted ton SYstem.InPtr ....

Darn ... and to say i knew nothing of delegates last week :)

With "AddressOf del" as  param, it tells me that AddressOf needs a method name instead .
0
 
LVL 10

Expert Comment

by:Jason Evans
ID: 21869991
Hi there.

Nope, I just checked and I was wrong. Change it back to this:

<DllImport("Librairie externe\AET60.dll", EntryPoint:="AET60_SetCallback", _
        SetLastError:=True, CallingConvention:=CallingConvention.Cdecl)> _
        Public Shared Function AET60_SetCallback(ByVal CallbackFunction As MyCallBack) As Integer
    End Function

Try this instead:

retcode = AET60_SetCallback(AddressOf CALLBACK_FUNCTION)

You don't need to do 'del = New....', simply pass the address of the CALLBACK_FUNCTION you already have.

Try that.
Cheers.
Jas.
0
Concerto Cloud for Software Providers & ISVs

Can Concerto Cloud Services help you focus on evolving your application offerings, while delivering the best cloud experience to your customers? From DevOps to revenue models and customer support, the answer is yes!

Learn how Concerto can help you.

 
LVL 1

Author Comment

by:David MacDonald
ID: 21873989
Hi Jas,
         still with the null exception ... just for pointers, i tried changing byval for byref on the MyCallBack param ... i get this error :

An unhandled exception of type 'System.AccessViolationException' occurred in AbonnementBiometrie.exe

So i guess Byval is alright ... But i really don't understand why it's not working ...
0
 
LVL 10

Accepted Solution

by:
Jason Evans earned 375 total points
ID: 21875367
Hi there.

Appologies for not being able to help more thoroughly on this, I'm a bit stuck now myself!

Here's a link that might help you:

http://www.experts-exchange.com/Programming/Languages/.NET/Q_23166550.html

Hope you get a result with this!

Cheers.
Jas.



0
 
LVL 1

Author Comment

by:David MacDonald
ID: 21877937
Hi there,
      it seems the problem lies in the structure definition used in the callback, the FBITMAP structure uses the FDATA strucuture wich in turn contains a Byte array ... Is it because my byte array is not initialise by default ... it sure seems like it ...  
Public Structure FDATA
        Dim Length As Integer
        Dim Data() As Byte
    End Structure
 
    Public Structure FBITMAP
        Dim Width As Integer
        Dim Height As Integer
        Dim Bitmap As FDATA
    End Structure

Open in new window

0
 
LVL 1

Author Comment

by:David MacDonald
ID: 21878367
Solved it !

it was the FDATA Byte array that was not initialized that popped the nullException ... Jas, i'm giving you the points anyway because you gave me hope ;-)
Public Structure FDATA
        Dim Length As Integer
        Shared Data(0 To 256) As Byte
    End Structure

Open in new window

0

Featured Post

NFR key for Veeam Backup for Microsoft Office 365

Veeam is happy to provide a free NFR license (for 1 year, up to 10 users). This license allows for the non‑production use of Veeam Backup for Microsoft Office 365 in your home lab without any feature limitations.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

In my previous article (http://www.experts-exchange.com/Programming/Languages/.NET/.NET_Framework_3.x/A_4362-Serialization-in-NET-1.html) we saw the basics of serialization and how types/objects can be serialized to Binary format. In this blog we wi…
In my previous two articles we discussed Binary Serialization (http://www.experts-exchange.com/A_4362.html) and XML Serialization (http://www.experts-exchange.com/A_4425.html). In this article we will try to know more about SOAP (Simple Object Acces…
This is my first video review of Microsoft Bookings, I will be doing a part two with a bit more information, but wanted to get this out to you folks.
Have you created a query with information for a calendar? ... and then, abra-cadabra, the calendar is done?! I am going to show you how to make that happen. Visualize your data!  ... really see it To use the code to create a calendar from a q…

671 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question