初识IntPtr

it2022-05-09  34

伙伴解说:

 c#结构体与C++指针互相转换时就用IntPtr   就是把一块内存或者一个结构体数据,通过Marshal类中的方法,进行封装和解析。  把C#结构体数据,封装后给C++接口使用。或把c++指针应的对象解析为结构体。   下列代码中pGpsData就是IntPtr类型,把这个相当于指针的东西,解析成结构体BVCU_PUCFG_GPSData。   1 BVCU_PUCFG_GPSData gpsdata = (BVCU_PUCFG_GPSData)Marshal.PtrToStructure(pGpsData, typeof(BVCU_PUCFG_GPSData));  以下为结构体BVCU_PUCFG_GPSData: 1 //GPS数据结构体 wfy on 20150417 2 [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)] 3 public struct BVCU_PUCFG_GPSData 4 { 5 public BVCU_WallTime stTime; 6 public Int32 iLongitude; 7 public Int32 iLatitude; 8 public Int32 iHeight; 9 public Int32 iAngle; 10 public Int32 iSpeed; 11 public Int32 iStarCount; 12 public Int32 bAntennaState; 13 public Int32 bOrientationState; 14 public int iSatelliteSignal; 15 [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] 16 Int32[] iReserved; 17 }

以下就是把结构体封装成Ptr引用:

1 BVCU_PUCFG_GPSData gpsData; 2 IntPtr pt = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(BVCU_PUCFG_GPSData))); 3 Marshal.StructureToPtr(gpsData, pt, true);

这里还涉及到由托管内存到非托管内存的转移。c#为托管,c++为非托管。

 

 

 

 

转载于:https://www.cnblogs.com/lxxhome/p/7028115.html

相关资源:数据结构—成绩单生成器

最新回复(0)