VB でのコールバック (C dll から)。
dll の ac 関数へのコールバックとして vb 関数を渡す必要があります。関数に 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 で、コールバック関数を定義しました。
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 ' ここで賢いことをする End Function
dll の外部関数は次のように呼び出されます。
err = Pa_OpenStream( ptr, _
nulthing, _
outputParameters, _
SAMPLE_RATE, _
FRAMES_PER_BUFFER, _
clipoff, _
AddressOf MyCallback, _
dataptr)
これは、外部関数の宣言で壊れています - AddressOf の関数ポインタとして型 IntPtr が好きではありません。
このコールバック関数を渡す実装方法を教えてもらえますか?
どうもありがとうデビッド