关于C#使用C++嵌套结构体的问题.请教一下各位


最近做一个项目,要使用的C++的dll,遇到复杂结构的结构体,返回结果总是不对,请各位帮忙看看
C++的结构体:

typedef struct CMS_GUID {
unsigned long  Data1;
unsigned short Data2;
unsigned short Data3;
unsigned char  Data4[ 8 ];
}*LPCMS_GUID;
#endif
/**@brief 镜头列表节点结构 */
typedef struct CMS_NodeData
{
NODE_HANDLE hNode; /**  节点HANDLE */
int nNodeID; /**  节点ID */
int nNodeType; /**  节点类型 */
int nStatus; /**  节点状态 0 :禁用; 1: 可用*/
int bPTZ; /**  是否云台 */
int nPTZType; /**  云台类型 */
int nPTZAddr; /**  云台地址 */
CMS_GUID devGUID; /**  镜头GUID */
char cName[64]; /**  节点名称 */
char cDescribe[200]; /**  节点描述 */
}*LPCMS_NodeData;


我定义的C#结构体:

   /// <summary>
   /// 节点数据结构体
   /// </summary>
   [StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
   public struct CMS_NodeData
   {
      // 错误 8 “SAGA.VideoSurveillanceSystems.Client.Common.CMS_NodeData.DevGUID”: 标记为 StructLayout(LayoutKind.Explicit) 的实例字段类型必须具有 FieldOffset 特性 E:\昆明看守所监控\3实现\05Code\VideoSurveillanceSystems\SAGA.VideoSurveillanceSystems.Client.Common\Devices.cs 61 22 SAGA.VideoSurveillanceSystems.Client.Common

       public IntPtr NodeHandle;
       public int NodeID;
       public int NodeType;
       public int Status;
       public int PTZ;
       public int PTZType;
       public int PTZAddr;
       public LPCMS_GUID DevGUID;
       [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]
       public string NodeName;
       [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 200)]
       public string NodeDescribe;

   }
    /// <summary>
    /// 镜头GUID
    /// </summary>
   [StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
   public struct LPCMS_GUID 
   {
       public uint Data1;
       public UInt16 Data2;
       public UInt16 Data3;
       [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]  
       public byte[] Data4;


   }

C++的函数定义:

/**@brief 得到第一个节点指针
* @param [IN] hServer 服务器句柄。
* @param [OUT] pData 节点数据结构指针,参见:LPCMS_NodeData。
* @return 返回如下错误码:
*         #成功,NOZERO
*         #失败,ZERO
* @note
*/
extern int __stdcall CMS_GetFirstNode(IN SERVER_HANDLE hServer,OUT LPCMS_NodeData pData);

C#的函数定义

       [DllImport("CMS_ClientComm.dll", EntryPoint = "CMS_GetFirstNode", ExactSpelling = false, CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode)]
       private static extern int CMS_GetFirstNode(ref IntPtr hLID, ref CMS_NodeData pData);


这样调用:

       public static List<CMS_NodeData> GetAllNode() 
       {
           List<CMS_NodeData> lstNode = new List<CMS_NodeData>();

           //获取第一个节点
           CMS_NodeData firstData=new CMS_NodeData();
           LPCMS_GUID guid =new LPCMS_GUID();
           IntPtr prGuid = StructOP.StructToBytes(guid);
          IntPtr pr = StructOP.StructToBytes(firstData);
          firstData.DevGUID = guid;
          int isSuccess = CMS_GetFirstNode(ref ServerInit.ServerHandle, ref firstData);
         // uint temp = ServerInit.CMS_GetLastError();
         //string eee = ErrorExport.Export(temp);
           //循环获取所有节点
     //   firstData =(LPCMS_NodeData)Marshal.PtrToStructure(pr, typeof(LPCMS_NodeData));
           return lstNode;
       }

分配内存空间的方法:

      internal static IntPtr StructToBytes(object obj)
        {
            try
            {
                //得到结构体的大小
                int size = Marshal.SizeOf(obj);
                //创建byte数组
             //   byte[] bytes = new byte[size];
                //分配结构体大小的内存空间
                IntPtr structPtr = Marshal.AllocHGlobal(size);
                //将结构体拷到分配好的内存空间
                Marshal.StructureToPtr(obj, structPtr, false);
                //从内存空间拷到byte数组
             //   Marshal.Copy(structPtr, bytes, 0, size);
                //释放内存空间
                Marshal.FreeHGlobal(structPtr);
                //返回byte数组
                return structPtr;
            }
            catch (Exception ex)
            {
                SAGA.Common.Log.Logger.Log(ex);
                return IntPtr.Zero;
            }
        }

始终都显示不能得到对应的值,其中

方法始终都返回0
在线等......

2 个解决方案

#1


自己拉一下,答案不好找啊

#2


没有人遇到过吗 ?
智能推荐

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号  

赞助商广告