MIDIHDR Problems

本文关键字:Problems MIDIHDR | 更新日期: 2023-09-27 17:56:47

我正在尝试为 WinMM.dll中的 MIDI 函数编写包装库,但我在使用 MIDI 长消息时遇到问题。我在 PIvnoke.net 中找到了这个(我自己添加了第一行):

[StructLayout(LayoutKind.Sequential)]
    public struct MIDIHDR
    {
        IntPtr lpData;
        int dwBufferLength;
        int dwBytesRecorded;
        IntPtr dwUser;
        int dwFlags;
        MIDIHDR lpNext;
        IntPtr reserved;
        int dwOffset;
        IntPtr dwReserved;
    }

但是我在编译时遇到错误:

错误 1 类型为"WinMMM.MidiWrapper.MIDIHDR.lpNext"的结构成员"WinMMM.MidiWrapper.MIDIHDR.lpNext"导致结构布局 C:''Users''Alex''Documents''Visual Studio 2010''Projects''WinMMM''WinMMM''MidiWrapper.cs 219 21 WinMMM

我正在使用Visual Studio Ultimate 2010,我正在制作一个C#类库,任何帮助将不胜感激!

MIDIHDR Problems

您可以更改:

MIDIHDR lpNext;

自:

IntPtr lpNext;

解决您的眼前问题。

MIDL 编译器无法取消引用这些结构的链,但如果 API 调用将一个结构作为参数,则通过此更改,指向下一个结构的链接将被解码为原始指针,就像第一个字段lpData一样。

我不确定你最后一点是正确的。 dwReserved 是一个由四个DWORD_PTRs组成的数组(请参阅 MSDN 上的 MIDIHDR)。你可以使用这样的东西:

    // http://msdn.microsoft.com/en-us/library/dd798449%28VS.85%29.aspx
    [StructLayout(LayoutKind.Sequential)]
    public struct MIDIHDR
    {
        public string lpData;
        public int dwBufferLength;
        public int dwBytesRecorded;
        public IntPtr dwUser;
        public int dwFlags;
        public IntPtr lpNext;
        public IntPtr reserved;
        public int dwOffset;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
        public IntPtr[] dwReserved;
    }

您还可以将 MIDIHDR 的声明从结构更改为类类型。