我正在尝试为 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 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 的声明从结构更改为类类型。