2
votes

Callbacks in VB (from C dll).

I need to pass a vb function as a callback to a c function in a dll. I know I need to use addressof for the function but I'm getting more and more confused as to how to do it.

Details:

The function in the dll that I'm passing the address of a callback to is defined in C as :

PaError Pa_OpenStream( PaStream** stream,
                       const PaStreamParameters *inputParameters,
                       const PaStreamParameters *outputParameters,
                       double sampleRate,
                       unsigned long framesPerBuffer,
                       PaStreamFlags streamFlags,
                       PaStreamCallback *streamCallback,
                       void *userData );

where the function is parameter 7, *streamCallback. The type PaStreamCallback is defines thusly:

typedef int PaStreamCallback(
    const void *input, void *output,
    unsigned long frameCount,
    const PaStreamCallbackTimeInfo* timeInfo,
    PaStreamCallbackFlags statusFlags,
    void *userData );

In my vb project I have:

Private Declare Function Pa_OpenStream Lib "portaudio_x86.dll" _
        (     ByVal stream As IntPtr _
            , ByVal inputParameters As IntPtr _
            , ByVal outputParameters As PaStreamParameters _
            , ByVal samprate As Double _
            , ByVal fpb As Double _
            , ByVal paClipoff As Long _
            , ByVal patestCallBack As IntPtr _
            , ByVal data As IntPtr) As Integer

(don't worry if I've mistyped some of the other parameters, I'll get to them later! Let's concentrate on the callback for now.)

In module1.vb I have defined the callback function:

Function MyCallback( ByVal inp As Byte, _ ByVal outp As Byte, _ ByVal framecount As Long, _ ByVal pastreamcallbacktimeinfo As Byte, _ ByVal pastreamcallbackflags As Byte, _ ByVal userdata As Byte) As Integer ' do clever things here End Function

The external function in the dll is called with

err = Pa_OpenStream(    ptr, _
            nulthing, _
            outputParameters, _
            SAMPLE_RATE, _
            FRAMES_PER_BUFFER, _
            clipoff, _
            AddressOf MyCallback, _
            dataptr)

This is broken in the declaration of the external function - it doesn't like the type IntPtr as a function pointer for AddressOf.

Can anyone show me how to implement passing this callback function please ?

Many thanks David

1

1 Answers