Проблемы с MIDIHDR - PullRequest
       40

Проблемы с MIDIHDR

4 голосов
/ 19 мая 2011

Я пытаюсь написать библиотеку-оболочку для функций MIDI в WinMM.dll, но у меня возникают проблемы с длинными сообщениями 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» вызывает цикл в макете структуры C: \ Users \ Alex \ Documents \ Visual Studio 2010 \ Projects \ WinMMM \ WinMMM \ MidiWrapper.cs 219 21 WinMMM

Я использую Visual Studio Ultimate 2010, я делаю библиотеку классов C #, и любая помощь будет оценена по достоинству!

Ответы [ 3 ]

4 голосов
/ 19 мая 2011

Вы можете изменить:

MIDIHDR lpNext;

до:

IntPtr lpNext;

чтобы решить вашу непосредственную проблему.

Компилятор MIDL не может разыменовать цепочку этих структур, но если вызов API принимает в качестве аргумента одну, то при таком изменении ссылка на следующую будет декодирована как необработанный указатель, как и первое поле lpData .

1 голос
/ 19 мая 2011

Я не уверен, что последний бит вашего правильного верен. dwReserved - это массив из четырех DWORD_PTR (см. MIDIHDR на MSDN ). Вы можете использовать что-то вроде этого:

    // 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;
    }
0 голосов
/ 19 мая 2011

Вы также можете изменить объявление MIDIHDR со структуры на тип класса.

...