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

标签 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#代码中定义如下:

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

我只在C#代码中定义了FILTER_MESSAGE_HEADERPFILTER_MESSAGE_HEADER不是。

我应该如何定义PFILTER_MESSAGE_HEADER??

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

最佳答案

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

[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 规范是防御性的并导致需要 ExactSpellingCommunicationPortSafeHandle 将是一个继承自 SafeHandleMinusOneIsInvalid 的类基于 the documentation on FilterConnectCommunicationPort .

您可以将此签名用作:

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

关于C# 如何定义新的指​​针结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27873808/

相关文章:

c - 使用 typedef 结构而不包括创建它的模块

c - 是否需要一个循环来将结构数组的每个成员设置在堆上?

C 结构内存布局偏移量

c# - 从 C# 驱动程序更新字段

c++ - 如何在 C++ 中正确访问 unsigned char 指针的数据?

c++ - 如何将 C++ 静态库链接到 C 程序?

c++ - 在 C++ 中的 vector/数组中存储不同类型的元素?

c# - 数组 session 对象

c# - 如何获取我的应用程序的上次写入或构建时间?

c# - sqlite-net 无法识别父类的主键