我正在尝试使用MMSystem
来呼叫midiInOpen,但不确定如何传递dwCallback
(midiInProc)。
我看了一下Winapi.MMSystem.pas
,并且将midiInOpen
函数声明为以下内容,但没有为dwInstance
传递什么提供任何线索:
{$EXTERNALSYM midiInOpen}
function midiInOpen(lphMidiIn: PHMIDIIN; uDeviceID: UINT;
dwCallback, dwInstance: DWORD_PTR; dwFlags: DWORD): MMRESULT; stdcall;
是否必须以某种方式声明Delphi中的回调函数,或者我可以传递与WinAPI手册中定义的midiInProc具有相同定义的过程地址?
答案 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;