在解析C#结构体指针前,必须知道C#结构体是如何定义的。在c#中同样定义该结构体。
2011-09-08 15:10
525 查看
在解析C#结构体指针前,必须知道C#结构体是如何定义的。在c#中同样定义该结构体。
C#结构体指针之C#结构体的定义:
[StructLayout(LayoutKind.Sequential)]
public struct VGAStat
{
public int ChannelNum;//通道数量
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
public char[] Version;//版本信息
public uint CPUUsage;//CPU占用
public bool WorkStatusOk; //工作状态
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public tagCheckArg[] ChannelStatistic;//通道信息
}
定义完结构体后,就可将接收到的C#结构体指针转换为定义的结构体对象。
VGAStat entries = (VGAStat)Marshal.PtrToStructure(iptr, typeof(VGAStat));
//iptr为接收到的非托管的结构体指针。
反之,也可将结构体赋值后封送到非托管内存。
假如vga为定义后实例化并赋值了的结构体。
IntPtr intptr = Marshal.AllocHGlobal(Marshal.SizeOf(vga));
Marshal.StructureToPtr(vga, intptr, true);
//在此发送intptr指针给目的方
Marshal.FreeHGlobal(intptr);//释放分配的非托管内存。
C#结构体指针之C#结构体的定义:
[StructLayout(LayoutKind.Sequential)]
public struct VGAStat
{
public int ChannelNum;//通道数量
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
public char[] Version;//版本信息
public uint CPUUsage;//CPU占用
public bool WorkStatusOk; //工作状态
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public tagCheckArg[] ChannelStatistic;//通道信息
}
定义完结构体后,就可将接收到的C#结构体指针转换为定义的结构体对象。
VGAStat entries = (VGAStat)Marshal.PtrToStructure(iptr, typeof(VGAStat));
//iptr为接收到的非托管的结构体指针。
反之,也可将结构体赋值后封送到非托管内存。
假如vga为定义后实例化并赋值了的结构体。
IntPtr intptr = Marshal.AllocHGlobal(Marshal.SizeOf(vga));
Marshal.StructureToPtr(vga, intptr, true);
//在此发送intptr指针给目的方
Marshal.FreeHGlobal(intptr);//释放分配的非托管内存。
相关文章推荐
- C#如何利用结构体对固定格式数据进行解析
- C#解析结构体指针
- 软件工程师必须知道的事 —— 如何定义自己的职业路线?
- 你必须知道的指针基础-6.内存的初始化及结构体的使用
- C#中如何定义与C++定义的对应的结构体
- 如何定义结构体指针
- C#如何定义结构体及访问结构体的成员
- C#结构体指针的定义及使用详解
- void类型的指针指向结构体,如何用->引用结构体内部元素
- 在C#中如何定义一个变长的结构数组?如果定义好了,如何获得当前数组的长度?
- C/C++的结构体中的静态变量必须在结构体外定义初始化
- 如何在C#中定义动态的数组结构啊??
- 你必须知道的C#的25个基础概念
- C# 解析 RSB图形结构
- C#程序员开发WinForm必须知道的 Window 消息大全
- 黑马程序员——如何理解当内部类中定义了静态成员,改内部类必须是静态的?
- C#如何定义全局变量
- 深入分析C语言中结构体指针的定义与引用详解
- C语言结构体及typedef关键字定义结构体别名和函数指针的应用
- C#中如何获取ItemsControl的DataTemplate中定义的控件?