Обратные вызовы в 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