4

我正在尝试在 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”的结构成员“WinMMM.MidiWrapper.MIDIHDR.lpNext”导致结构布局 C:\Users\Alex\Documents\Visual Studio 2010\Projects\WinMMM\WinMMM\MidiWrapper 出现循环。 cs 219 21 赢MMM

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

4

3 回答 3

4

你可以改变:

MIDIHDR lpNext;

到:

IntPtr lpNext;

来解决你眼前的问题。

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

于 2011-05-19T00:09:56.713 回答
1

我不确定你正确的最后一点是正确的。dwReserved 是一个包含四个 DWORD_PTR 的数组(请参阅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;
    }
于 2011-05-19T10:31:11.873 回答
0

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

于 2011-05-19T00:10:07.437 回答