DLL 中的回调 (Windows API)?
Callbacks in a DLL (Windows API)?
我需要编写一个接口库 winmm.dll。
https://msdn.microsoft.com/en-us/library/windows/desktop/dd798458(v=vs.85).aspx
public static class winmm {
...
[DllImport("winmm.dll", SetLastError = true)]
public static extern uint midiInOpen(out UIntPtr lphMidiIn, uint
uDeviceID, UIntPtr dwCallback, UIntPtr dwCallbackInstance, uint dwFlags);
...
}
public void MidiInOpen() {
winmm.midiInOpen(out midiHdl, (uint)deviceId, CALLBACK, CALLBACKINSTANCE, FLAG);
}
public void midiInCallback() {
...
}
如何设置 dwCallback
和 dwCallbackInstance
参数?
关于 dwCallback
使用 delegate
设置
[DllImport("winmm.dll", SetLastError = true)]
private static extern MMRESULT midiInOpen(out HMIDIIN lphMidiIn, UIntPtr uDeviceID,
MidiInProc dwCallback, UIntPtr dwCallbackInstance, MidiOpenFlags dwFlags);
[StructLayout(LayoutKind.Sequential)]
public struct HMIDIIN
{
public IntPtr handle;
}
public enum MMRESULT : uint
{
// General return codes.
MMSYSERR_BASE = 0,
MMSYSERR_NOERROR = MMSYSERR_BASE + 0,
...
}
public enum MidiOpenFlags : uint
{
CALLBACK_TYPEMASK = 0x70000,
CALLBACK_NULL = 0x00000,
...
}
public enum MidiInMessage : uint
{
MIM_OPEN = 0x3C1,
MIM_CLOSE = 0x3C2,
...
}
代表
public delegate void MidiInProc(HMIDIIN hMidiIn, MidiInMessage wMsg, UIntPtr dwInstance, UIntPtr dwParam1, UIntPtr dwParam2);
用法
MidiInProc dwCallback ...
public static MMRESULT midiInOpen(out HMIDIIN lphMidiIn, UIntPtr uDeviceID, MidiInProc dwCallback, UIntPtr dwCallbackInstance)
{
return midiInOpen(out lphMidiIn, uDeviceID, dwCallback, dwCallbackInstance, dwCallback == null ? MidiOpenFlags.CALLBACK_NULL : MidiOpenFlags.CALLBACK_FUNCTION);
}
关于 dwCallbackInstance
使用 GCHandle
dwCallbackInstance User instance data passed to the callback function. This parameter is not used with window callback functions or
threads.
How To Convert Object To IntPtr And Back?
How can an UIntPtr object be converted to IntPtr in C#?
只要四处挖掘,Windows API 个主题有很多资源
我需要编写一个接口库 winmm.dll。
https://msdn.microsoft.com/en-us/library/windows/desktop/dd798458(v=vs.85).aspx
public static class winmm {
...
[DllImport("winmm.dll", SetLastError = true)]
public static extern uint midiInOpen(out UIntPtr lphMidiIn, uint
uDeviceID, UIntPtr dwCallback, UIntPtr dwCallbackInstance, uint dwFlags);
...
}
public void MidiInOpen() {
winmm.midiInOpen(out midiHdl, (uint)deviceId, CALLBACK, CALLBACKINSTANCE, FLAG);
}
public void midiInCallback() {
...
}
如何设置 dwCallback
和 dwCallbackInstance
参数?
关于 dwCallback
使用 delegate
设置
[DllImport("winmm.dll", SetLastError = true)]
private static extern MMRESULT midiInOpen(out HMIDIIN lphMidiIn, UIntPtr uDeviceID,
MidiInProc dwCallback, UIntPtr dwCallbackInstance, MidiOpenFlags dwFlags);
[StructLayout(LayoutKind.Sequential)]
public struct HMIDIIN
{
public IntPtr handle;
}
public enum MMRESULT : uint
{
// General return codes.
MMSYSERR_BASE = 0,
MMSYSERR_NOERROR = MMSYSERR_BASE + 0,
...
}
public enum MidiOpenFlags : uint
{
CALLBACK_TYPEMASK = 0x70000,
CALLBACK_NULL = 0x00000,
...
}
public enum MidiInMessage : uint
{
MIM_OPEN = 0x3C1,
MIM_CLOSE = 0x3C2,
...
}
代表
public delegate void MidiInProc(HMIDIIN hMidiIn, MidiInMessage wMsg, UIntPtr dwInstance, UIntPtr dwParam1, UIntPtr dwParam2);
用法
MidiInProc dwCallback ...
public static MMRESULT midiInOpen(out HMIDIIN lphMidiIn, UIntPtr uDeviceID, MidiInProc dwCallback, UIntPtr dwCallbackInstance)
{
return midiInOpen(out lphMidiIn, uDeviceID, dwCallback, dwCallbackInstance, dwCallback == null ? MidiOpenFlags.CALLBACK_NULL : MidiOpenFlags.CALLBACK_FUNCTION);
}
关于 dwCallbackInstance
使用 GCHandle
dwCallbackInstance User instance data passed to the callback function. This parameter is not used with window callback functions or threads.
How To Convert Object To IntPtr And Back?
How can an UIntPtr object be converted to IntPtr in C#?
只要四处挖掘,Windows API 个主题有很多资源