Передача функции обратного вызова VB в C dll - noob застрял - PullRequest
2 голосов
/ 27 января 2009

Обратные вызовы в VB (из C dll).

Мне нужно передать функцию vb в качестве обратного вызова функции c в dll. Я знаю, что мне нужно использовать addressof для функции, но я все больше и больше путаюсь с тем, как это сделать.

Детали:

Функция в dll, которой я передаю адрес обратного вызова, определяется в C как:

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

, где функцией является параметр 7, * streamCallback. Тип PaStreamCallback определяется следующим образом:

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

В моем проекте VB у меня есть:

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

(не беспокойтесь, если я набрал некоторые другие параметры, я вернусь к ним позже! Давайте сосредоточиться на обратном вызове пока.)

В module1.vb я определил функцию обратного вызова:

Функция 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) Как целое число делать умные вещи здесь Конечная функция

Внешняя функция в dll вызывается с помощью

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

Это не работает в объявлении внешней функции - ей не нравится тип IntPtr в качестве указателя на функцию для AddressOf.

Может кто-нибудь показать мне, как реализовать передачу этой функции обратного вызова, пожалуйста?

Большое спасибо David

1 Ответ

1 голос
/ 27 января 2009
...