C# 如何定义新的指针结构?
C# How to define new pointer 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 以在函数中使用此结构。
您不必(不能)定义 PFILTER_MESSAGE_HEADER
。只需根据需要将其指定为 out
或 ref
。
[DllImport("foo")]
void SomeMethod(ref FILTER_MESSAGE_HEADER lpMessageBuffer);
如果您对 FilterGetMessage
特别感兴趣,我不确定它是否从中导出任何 dll,但一种可能的签名如下:
[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
规范是防御性的,因此需要 ExactSpelling
. CommunicationPortSafeHandle
将是继承自 SafeHandleMinusOneIsInvalid
based off of the documentation on FilterConnectCommunicationPort
的 class。
您可以将此签名用作:
FILTER_MESSAGE_HEADER header;
FilterGetMessage(hFilter, ref header,
Marshal.SizeOf(typeof(FILTER_MESSAGE_HEADER)), IntPtr.Zero);
这个结构定义在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 以在函数中使用此结构。
您不必(不能)定义 PFILTER_MESSAGE_HEADER
。只需根据需要将其指定为 out
或 ref
。
[DllImport("foo")]
void SomeMethod(ref FILTER_MESSAGE_HEADER lpMessageBuffer);
如果您对 FilterGetMessage
特别感兴趣,我不确定它是否从中导出任何 dll,但一种可能的签名如下:
[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
规范是防御性的,因此需要 ExactSpelling
. CommunicationPortSafeHandle
将是继承自 SafeHandleMinusOneIsInvalid
based off of the documentation on FilterConnectCommunicationPort
的 class。
您可以将此签名用作:
FILTER_MESSAGE_HEADER header;
FilterGetMessage(hFilter, ref header,
Marshal.SizeOf(typeof(FILTER_MESSAGE_HEADER)), IntPtr.Zero);