C# 指针数组,调用第三方dll,参数传递问题

duang_in_duang 2017-10-19 03:25:05
在调用第三方的dll的某个函数后,会返回一个WFS_CDM_STATUS结构体,结构体定义如下

   
public unsafe struct WFS_CDM_STATUS
{
public ushort fwDevice;
public ushort fwSafeDoor;
public ushort fwDispenser;
public ushort fwIntermediateStacker;
public IntPtr lppPositions;
public string lpszExtra;
public fixed uint dwGuidLights[CDMDefinition.WFS_CDM_GUIDLIGHTS_SIZE];
public ushort wDevicePosition;
public ushort usPowerSaveRecoveryTime;
}


//lppPositions 指向WFS_CDM_OUTPOS 结构以NULL结尾的指针数组。此结构体所有参数均有效且能够被分配
public struct WFS_CDM_OUTPOS
{
public ushort fwPosition;
public ushort fwShutter;
public ushort fwPositionStatus;
public ushort fwTransport;
public ushort fwTransportStatus;
}

我的做法
                   
WFS_CDM_STATUS state = new WFS_CDM_STATUS();
XFSUtil.PtrToStructure(result.lpBuffer, ref state);
WFS_CDM_OUTPOS pos=new WFS_CDM_OUTPOS();
XFSUtil.PtrToStructure(state.lppPositions, ref pos);


现在的问题是这个lppPosition会返回多少结构体不知道,我需要的只是它返回来的第一个结构体中的数据,即lppPosition[0],谁给处处主意,这个应该怎么处理?
...全文
219 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
duang_in_duang 2017-10-25
  • 打赏
  • 举报
回复
前段时间因为其他原因,意志力消沉,一直没有来结这个帖子,今天看了,也没有人回复过,算了吧,总之问题还是自己解决了,现在,我说下我的解决方法 问题描述中也说过,就是函数返回的是一个指针数组,这里数组里面的指针都是指向WFS_CDM_OUTPOS这个结构体的,问题是不知道这个数组多大,会有多少个指针在里面? 所以我的解决思路是,编写一个算法算出指针的大小,然后在根据需要取出需要的那个指针,将其指向WFS_CDM_OUTPOS结构体,获得需要的数据 话不多说了,上代码:
        public static T[] XFSPtrToArray<T>(IntPtr ptr)//T表示的需要指向的结构体类型
        {
            if (ptr != IntPtr.Zero)
            {
                int len = 0;
                for (int i = 0; Marshal.ReadIntPtr(IntPtr.Add(ptr, i)) != IntPtr.Zero; i += IntPtrSize)
                    ++len;
                if (len > 0)
                {
                    T[] arr = new T[len];
                    for (int i = 0; i < len; ++i)
                    {
                        arr[i] = (T)Marshal.PtrToStructure(Marshal.ReadIntPtr(IntPtr.Add(ptr, i * IntPtrSize)), typeof(T));
                    }
                    return arr;
                }
            }
            return new T[0];//我这需要的是第一个指针,所以就取了这个。
        }
然后利用这个函数,最终解决我遇到的问题。感恩,希望对以后遇到这方面问题的人有所帮助

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧