【问题标题】:Callbacks in a DLL (Windows API)? [duplicate]DLL(Windows API)中的回调? [复制]
【发布时间】:2018-02-02 01:42:42
【问题描述】:

我需要编写一个与 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() {
      ...
 }

如何设置dwCallbackdwCallbackInstance 参数?

【问题讨论】:

    标签: c# pinvoke


    【解决方案1】:

    关于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

    midiInOpen function

    dwCallbackInstance 传递给回调函数的用户实例数据。此参数不用于窗口回调函数或 线程。

    How To Convert Object To IntPtr And Back?

    How can an UIntPtr object be converted to IntPtr in C#?

    随便看看吧,有很多关于 Windows API 主题的资源

    【讨论】:

    • 在哪里可以找到其余的 MidiOpenFlags、MidiInMessage 等值?
    • 它们可以在文档中找到,但是,请稍等
    • @bwoogie 为您的方便更新
    • 谢谢!如果不介意的话,可以发链接吗?我到处都看了..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-17
    • 1970-01-01
    • 1970-01-01
    • 2015-02-27
    • 2014-01-16
    • 1970-01-01
    相关资源
    最近更新 更多