C#如何定义新的指​​针结构?

时间:2015-01-10 07:16:15

标签: c# c++ struct

此结构在http://msdn.microsoft.com/en-us/library/windows/hardware/ff541621%28v=vs.85%29.aspx

定义
typedef struct _FILTER_MESSAGE_HEADER {
  ULONG     ReplyLength;
  ULONGLONG MessageId;
} FILTER_MESSAGE_HEADER, *PFILTER_MESSAGE_HEADER;

我在C# code中将其定义如下:

[StructLayout(LayoutKind.Sequential)]
public struct FILTER_MESSAGE_HEADER {
      public uint replyLength;
      public ulong messageId;
};

我只在C# code中定义 FILTER_MESSAGE_HEADER PFILTER_MESSAGE_HEADER 不是。

如何定义 PFILTER_MESSAGE_HEADER ??

P / S:我想定义 PFILTER_MESSAGE_HEADER 以在函数中使用此结构。

1 个答案:

答案 0 :(得分:2)

您不必(不能)定义PFILTER_MESSAGE_HEADER。只需根据需要将其指定为outref

[DllImport("foo")]
void SomeMethod(ref FILTER_MESSAGE_HEADER lpMessageBuffer);


如果您对FilterGetMessage特别感兴趣,我不确定它是如何导出的,但是一个可能的签名如下:

[DllImport(fltmgr, CharSet=CharSet.Unicode, ExactSpelling=true, PreserveSig=false)]
void FilterGetMessage(
    CommunicationPortSafeHandle hPort, 
    ref FILTER_MESSAGE_HEADER lpMessageBuffer,
    uint dwMessageBufferSize,
    IntPtr lpOverlapped);

我使用PreserveSig在发生故障时自动将HRESULT转换为例外,CharSet规范具有防御性,因此需要ExactSpellingCommunicationPortSafeHandle将是一个基于SafeHandleMinusOneIsInvalidthe documentation on FilterConnectCommunicationPort继承的类。

您可以将此签名用作:

FILTER_MESSAGE_HEADER header;
FilterGetMessage(hFilter, ref header, 
    Marshal.SizeOf(typeof(FILTER_MESSAGE_HEADER)), IntPtr.Zero);