【问题标题】:How do I get the next item in an array when I am given the first element via pinvoke?当我通过 pinvoke 获得第一个元素时,如何获取数组中的下一个元素?
【发布时间】:2013-01-11 05:30:58
【问题描述】:

我正在使用一个 API,其方法定义如下:

[DllImport("icsneo40.dll")]
public static extern Int32 icsneoGetMessages(Int32 hObject, ref icsSpyMessage pMsg, ref          Int32 pNumberOfMessages, ref Int32 pNumberOfErrors);

icsSpyMessage参数描述为:

pMsg [输出]
这是数组的第一个元素的地址 icsSpyMessage 结构。这个数组将被加载 硬件接收到的消息。该数组的大小必须适合 20,000 个 icsSpyMessage 结构

我的问题是,当我只有第一个元素时,如何访问数组中的其他元素?

【问题讨论】:

    标签: c# pinvoke


    【解决方案1】:

    由于您要传递一个数组,您应该将icsSpyMessage 声明为一个数组:

    [DllImport("icsneo40.dll")]
    public static extern Int32 icsneoGetMessages(
        Int32 hObject, 
        [Out] icsSpyMessage[] pMsg,
        ref Int32 pNumberOfMessages, 
        ref Int32 pNumberOfErrors
    );
    

    [out] 属性指示 p/invoke 编组器将本机内存编组回您的托管结构数组。编组器会根据托管数组的长度来编组元素。

    所以你需要在调用函数之前分配这个数组。您调用的 API 要求您提供至少包含 20,000 个元素的数组。

    icsSpyMessage[] pMsg = new icsSpyMessage[20000];
    Int32 result = icsneoGetMessages(hObject, pMsg, 
        ref pNumberOfMessages, ref pNumberOfErrors);
    

    【讨论】:

      【解决方案2】:

      像这样:

      [DllImport("icsneo40.dll")]
      
      public static extern Int32 icsneoGetMessages(
          Int32 hObject, 
          [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)]
          out icsSpyMessage[] pMsg, 
          ref Int32 pNumberOfMessages, 
          ref Int32 pNumberOfErrors
      );
      

      【讨论】:

      • 这是不正确的。它不应该使用out 参数。那应该被删除。相反,您需要 [out] 属性。看我的回答。而且碰巧不需要MarshalAs,因为默认行为是编组整个数组。我想 SizeParamIndex 出于性能原因可能很有价值。
      【解决方案3】:

      为什么要把事情复杂化?所有这些都是指向某种结构或结构数组的指针。因此声明你的 20k 大小的数组

      icsSpyMessage myMessages[20000];

      将其传递给此方法,如下所示:

      int 结果 = icsneoGetMessages( 等等, myMessages[0], //

      当你收到消息时,你可以通过“foreach(icsSpyMessage item in myMessages) { ... }

      希望这会有所帮助..

      【讨论】:

        猜你喜欢
        • 2011-05-04
        • 1970-01-01
        • 2010-12-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-05
        • 1970-01-01
        相关资源
        最近更新 更多