1

I need to write a library that interfaces 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() {
      ...
 }

How do I set the dwCallback and dwCallbackInstance parameters?

TheGeneral
  • 79,002
  • 9
  • 103
  • 141
bwoogie
  • 4,339
  • 12
  • 39
  • 72

1 Answers1

1

Regarding dwCallback use a delegate

Setup

[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,
   ...
}

Delegate

public delegate void MidiInProc(HMIDIIN hMidiIn, MidiInMessage wMsg, UIntPtr dwInstance, UIntPtr dwParam1, UIntPtr dwParam2);

Usage

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);
}

Regarding dwCallbackInstance use GCHandle

midiInOpen function

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#?

Just dig around, there are plenty of resources for Windows API topics

TheGeneral
  • 79,002
  • 9
  • 103
  • 141