如何定义用于WinAPI函数(midiInOpen)的回调函数

时间:2019-08-25 00:14:55

标签: delphi

我正在尝试使用MMSystem来呼叫midiInOpen,但不确定如何传递dwCallbackmidiInProc)。

我看了一下Winapi.MMSystem.pas,并且将midiInOpen函数声明为以下内容,但没有为dwInstance传递什么提供任何线索:

{$EXTERNALSYM midiInOpen}
function midiInOpen(lphMidiIn: PHMIDIIN; uDeviceID: UINT;
  dwCallback, dwInstance: DWORD_PTR; dwFlags: DWORD): MMRESULT; stdcall;

是否必须以某种方式声明Delphi中的回调函数,或者我可以传递与WinAPI手册中定义的midiInProc具有相同定义的过程地址?

1 个答案:

答案 0 :(得分:2)

根据midiInOpen()文档:

  

dwCallback

     

指向回调函数,线程标识符或带有有关传入MIDI消息的信息的窗口的句柄的指针。 有关回调函数的更多信息,请参见MidiInProc

如果使用回调函数,它必须与MidiInProc的签名匹配:

void CALLBACK MidiInProc(
  HMIDIIN   hMidiIn,
  UINT      wMsg,
  DWORD_PTR dwInstance,
  DWORD_PTR dwParam1,
  DWORD_PTR dwParam2
 );

例如

procedure MyMidiInCallback(hMidiIn: HMIDIIN; wMsg: UINT; dwInstance, dwParam1, dwParam2: DWORD_PTR); stdcall;
begin
  // do something...
end;

...

var
  uDeviceID: UINT;
  hMidiIn: HMIDIIN;
begin
  uDeviceID := ...;
  midiInOpen(@hMidiIn, uDeviceID, DWORD_PTR(@MyMidiInCallback), 0, CALLBACK_FUNCTION);
  ...
  midiInClose(hMidiIn);
end;