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 WinMMM

私は Visual Studio Ultimate 2010 を使用しており、C# クラス ライブラリを作成しています。

4

3 に答える 3

4

あなたになら変えられる:

MIDIHDR lpNext;

に:

IntPtr lpNext;

あなたの当面の問題を解決するために。

MIDLコンパイラはこれらの構造のチェーンを逆参照できませんが、API呼び出しが引数として1つを取る場合、この変更により、次の構造へのリンクは、最初のフィールドと同様に生のポインタとしてデコードされますlpData

于 2011-05-19T00:09:56.713 に答える
1

あなたの正しい最後のビットが正しいかどうかはわかりません。dwReserved は、4 つの 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 に答える