一、获取Struct

                CHCNetSDK.NET_DVR_PTZPOS pos = new CameraTest.CHCNetSDK.NET_DVR_PTZPOS();
int size = Marshal.SizeOf(typeof(CHCNetSDK.NET_DVR_PTZPOS));
IntPtr ptr = Marshal.AllocHGlobal(size);// 申请内存
uint bytesReturnd = ; try
{
if (!CHCNetSDK.NET_DVR_GetDVRConfig(userId, CHCNetSDK.NET_DVR_GET_PTZPOS, Model.ShareData.IPCChannel, ptr, (uint)size, ref bytesReturnd))
{
IPCHelper.LogErrr(nameof(CHCNetSDK.NET_DVR_GetDVRConfig));
this.Results = ConstInfos.INVOKE_SDK_ERROR;
return;
} pos = (CHCNetSDK.NET_DVR_PTZPOS)Marshal.PtrToStructure(ptr, typeof(CHCNetSDK.NET_DVR_PTZPOS)); // 指针转结构
}
finally
{
Marshal.FreeHGlobal(ptr); // 释放指针
}

二、传递Struct

 // 设置 PTZ 参数
CHCNetSDK.NET_DVR_PTZPOS pos = new CameraTest.CHCNetSDK.NET_DVR_PTZPOS() { wAction = (ushort)action, wPanPos = GetSetPTZ(rectArgs.X), wTiltPos = GetSetPTZ(rectArgs.Y), wZoomPos = GetSetPTZ(rectArgs.Width) }; LogHelper.Action("SET_PTZ, 交互值 Action:{0}, P:{1}, T:{2}, Z:{3}", pos.wAction, pos.wPanPos, pos.wTiltPos, pos.wZoomPos); int size = Marshal.SizeOf(typeof(CHCNetSDK.NET_DVR_PTZPOS));
IntPtr ptr = Marshal.AllocHGlobal(size); // 申请内存
Marshal.StructureToPtr(pos, ptr, true); // 将数据传递到指针 try
{
if (!CHCNetSDK.NET_DVR_SetDVRConfig(userId, CHCNetSDK.NET_DVR_SET_PTZPOS, Model.ShareData.IPCChannel, ptr, (uint)size))
{
IPCHelper.LogErrr(nameof(CHCNetSDK.NET_DVR_SetDVRConfig));
this.Results = ConstInfos.INVOKE_SDK_ERROR;
return;
}
}
finally
{
Marshal.FreeHGlobal(ptr); // 释放指针
}

三、C++  类型与 C#类型对应关系

//c++:HANDLE(void   *)          ----    c#:System.IntPtr 
        //c++:Byte(unsigned   char)     ----    c#:System.Byte 
        //c++:SHORT(short)              ----    c#:System.Int16 
        //c++:WORD(unsigned   short)    ----    c#:System.UInt16 
        //c++:INT(int)                  ----    c#:System.Int16
        //c++:INT(int)                  ----    c#:System.Int32 
        //c++:UINT(unsigned   int)      ----    c#:System.UInt16
        //c++:UINT(unsigned   int)      ----    c#:System.UInt32
        //c++:LONG(long)                ----    c#:System.Int32 
        //c++:ULONG(unsigned   long)    ----    c#:System.UInt32 
        //c++:DWORD(unsigned   long)    ----    c#:System.UInt32 
        //c++:DECIMAL                   ----    c#:System.Decimal 
        //c++:BOOL(long)                ----    c#:System.Boolean 
        //c++:CHAR(char)                ----    c#:System.Char 
        //c++:LPSTR(char   *)           ----    c#:System.String 
        //c++:LPWSTR(wchar_t   *)       ----    c#:System.String 
        //c++:LPCSTR(const   char   *)  ----    c#:System.String 
        //c++:LPCWSTR(const   wchar_t   *)      ----    c#:System.String 
        //c++:PCAHR(char   *)   ----    c#:System.String 
        //c++:BSTR              ----    c#:System.String 
        //c++:FLOAT(float)      ----    c#:System.Single 
        //c++:DOUBLE(double)    ----    c#:System.Double 
        //c++:VARIANT           ----    c#:System.Object 
        //c++:PBYTE(byte   *)   ----    c#:System.Byte[]

//c++:BSTR      ----    c#:StringBuilder
        //c++:LPCTSTR   ----    c#:StringBuilder
        //c++:LPCTSTR   ----    c#:string
        //c++:LPTSTR    ----    c#:[MarshalAs(UnmanagedType.LPTStr)] string 
        //c++:LPTSTR 输出变量名    ----    c#:StringBuilder 输出变量名
        //c++:LPCWSTR   ----    c#:IntPtr
        //c++:BOOL      ----    c#:bool   
        //c++:HMODULE   ----    c#:IntPtr    
        //c++:HINSTANCE ----    c#:IntPtr 
        //c++:结构体    ----    c#:public struct 结构体{}; 
        //c++:结构体 **变量名   ----    c#:out 变量名   //C#中提前申明一个结构体实例化后的变量名
        //c++:结构体 &变量名    ----    c#:ref 结构体 变量名

//c++:WORD      ----    c#:ushort
        //c++:DWORD     ----    c#:uint
        //c++:DWORD     ----    c#:int

//c++:UCHAR     ----    c#:int
        //c++:UCHAR     ----    c#:byte
        //c++:UCHAR*    ----    c#:string
        //c++:UCHAR*    ----    c#:IntPtr

//c++:GUID      ----    c#:Guid
        //c++:Handle    ----    c#:IntPtr
        //c++:HWND      ----    c#:IntPtr
        //c++:DWORD     ----    c#:int
        //c++:COLORREF  ----    c#:uint

//c++:unsigned char     ----    c#:byte
        //c++:unsigned char *   ----    c#:ref byte
        //c++:unsigned char *   ----    c#:[MarshalAs(UnmanagedType.LPArray)] byte[]
        //c++:unsigned char *   ----    c#:[MarshalAs(UnmanagedType.LPArray)] Intptr

//c++:unsigned char &   ----    c#:ref byte
        //c++:unsigned char 变量名      ----    c#:byte 变量名
        //c++:unsigned short 变量名     ----    c#:ushort 变量名
        //c++:unsigned int 变量名       ----    c#:uint 变量名
        //c++:unsigned long 变量名      ----    c#:ulong 变量名

//c++:char 变量名       ----    c#:byte 变量名   //C++中一个字符用一个字节表示,C#中一个字符用两个字节表示
        //c++:char 数组名[数组大小]     ----    c#:MarshalAs(UnmanagedType.ByValTStr, SizeConst = 数组大小)]        public string 数组名; ushort

//c++:char *            ----    c#:string       //传入参数
        //c++:char *            ----    c#:StringBuilder//传出参数
        //c++:char *变量名      ----    c#:ref string 变量名
        //c++:char *输入变量名  ----    c#:string 输入变量名
        //c++:char *输出变量名  ----    c#:[MarshalAs(UnmanagedType.LPStr)] StringBuilder 输出变量名

//c++:char **           ----    c#:string
        //c++:char **变量名     ----    c#:ref string 变量名
        //c++:const char *      ----    c#:string
        //c++:char[]            ----    c#:string
        //c++:char 变量名[数组大小]     ----    c#:[MarshalAs(UnmanagedType.ByValTStr,SizeConst=数组大小)] public string 变量名;

//c++:struct 结构体名 *变量名   ----    c#:ref 结构体名 变量名
        //c++:委托 变量名   ----    c#:委托 变量名

//c++:int       ----    c#:int
        //c++:int       ----    c#:ref int
        //c++:int &     ----    c#:ref int
        //c++:int *     ----    c#:ref int      //C#中调用前需定义int 变量名 = 0;

//c++:*int      ----    c#:IntPtr
        //c++:int32 PIPTR *     ----    c#:int32[]
        //c++:float PIPTR *     ----    c#:float[]

//c++:double** 数组名          ----    c#:ref double 数组名
        //c++:double*[] 数组名          ----    c#:ref double 数组名
        //c++:long          ----    c#:int
        //c++:ulong         ----    c#:int
        
        //c++:UINT8 *       ----    c#:ref byte       //C#中调用前需定义byte 变量名 = new byte();

//c++:handle    ----    c#:IntPtr
        //c++:hwnd      ----    c#:IntPtr
        
        
        //c++:void *    ----    c#:IntPtr        
        //c++:void * user_obj_param    ----    c#:IntPtr user_obj_param
        //c++:void * 对象名称    ----    c#:([MarshalAs(UnmanagedType.AsAny)]Object 对象名称

//c++:char, INT8, SBYTE, CHAR                               ----    c#:System.SByte  
        //c++:short, short int, INT16, SHORT                        ----    c#:System.Int16  
        //c++:int, long, long int, INT32, LONG32, BOOL , INT        ----    c#:System.Int32  
        //c++:__int64, INT64, LONGLONG                              ----    c#:System.Int64  
        //c++:unsigned char, UINT8, UCHAR , BYTE                    ----    c#:System.Byte  
        //c++:unsigned short, UINT16, USHORT, WORD, ATOM, WCHAR , __wchar_t             ----    c#:System.UInt16  
        //c++:unsigned, unsigned int, UINT32, ULONG32, DWORD32, ULONG, DWORD, UINT      ----    c#:System.UInt32  
        //c++:unsigned __int64, UINT64, DWORDLONG, ULONGLONG                            ----    c#:System.UInt64  
        //c++:float, FLOAT                                                              ----    c#:System.Single  
        //c++:double, long double, DOUBLE                                               ----    c#:System.Double

四、MSDN参考资料

https://msdn.microsoft.com/library/aa288468(v=vs.71).aspx

https://msdn.microsoft.com/library/aa645736(v=vs.71).aspx

P Invoke struct结构的更多相关文章

  1. C# Struct结构体里数组长度的指定

    typedef struct Point{ unsigned short x; unsigned short y; }mPoint;//点坐标 typedef struct Line{ mPoint ...

  2. C#基础--struct(结构体)

    结构体和类有点类似    我们定义一个类的时候    是class   类名   定义结构体的时候是 struct   结构体名 结构体的写法 struct Point { // public int ...

  3. 1.0 基础、标示符、常量、数据类型(enum 枚举,struct 结构体)、操作符、循环、数组

    一.程序 现实生活中,程序是指完成某些事务的一种既定方法和过程,可以把程序看成是一系列动作执行过程的描述. 在计算机世界,程序是指令,即为了让计算机执行某些操作或解决某个问题而编写的一系列有序指令的集 ...

  4. Golang struct结构

    结构struct Go中的struct与C中的struct非常相似,并且Go没有class,代替了class的位置,但并没有代替class的功能 使用type struct{} 定义结构,名称遵循可见 ...

  5. C#语言struct结构体适用场景和注意事项

    在C#语言中struct结构体和class之间的区别主要是值类型和引用类型的区别,但实际上如果使用不当是非常要命的.从Win32时代过来的人对于struct一点不感觉陌生,但是却反而忽略了一些基本问题 ...

  6. C语言 Struct 结构体在 Java 中的体现

    大一整个学期完成了 C 语言的学习,大二就进入了Java 的学习. 和C语言一样,我们都会尝试写一个小小的学生管理系统什么的,学习过 C 语言同学知道,在管理系统中 Struct 结构体是个很好用的东 ...

  7. Swift Struct 结构体

    前言 Swift 语言有两种基本的数据类型,即类(class)和结构体(struct),class 这样的概念大家不会陌生,而 struct 也并不是什么新的概念,在 Objective-C 和 C ...

  8. go struct结构体

    struct结构体 用来自定义复杂数据结构 struct里面可以包含多个字段(属性),字段可以是任意类型 struct类型可以定义方法,注意和函数的区分 struct类型是值类型 struct类型可以 ...

  9. (C)struct结构体指针

    结构体指针 指针结构与指针的关系亦有两重:其一是在定义结构时,将指针作为结构中的一个成员:其二是指向结构的指针(称为结构指针). 前者同一般的结构成员一样可直接进行访问,后者是本节讨论的重点. 结构指 ...

随机推荐

  1. scrapy 手动编写模板

    import scrapy class Tzspider(scrapy.Spider): # spider的名字,唯一 name = 'tz' # 初始url列表 start_urls = ['htt ...

  2. php防攻击

    客户端脚本植入 XSS跨站脚本攻击(跨站脚本攻击,输入(传入)自动执行恶意的HTML代码,如盗取用户Cookie.破坏页面结构.重定向到其它网站):过滤<,>&,"等特殊 ...

  3. 错误: 在类中找不到 main 方法, 请将 main 方法定义为:public static void main(String[] args)否则 JavaFX 应用程序类必须扩展javafx.ap

    最近在使用eclipse编写java程序时遇到这样一个问题: 错误在类中找不到main方法,请将main方法定义为 public static void main(String[] args)否则 J ...

  4. hdu 1237 简单计算器 (表达式求值)【stack】

    <题目链接> 题目大意: 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值.  Input测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符, ...

  5. 大数据环境完全分布式搭建linux(centos)中安装zookeeper

    切记 要关闭防火墙   chkconfig iptables off(关闭防火墙的命令) 1.解压安装包 tar -zxvf zookeeper-3.4.5.tar.gz 2.在conf文件夹下 修改 ...

  6. 关于visual assist x插件不能用的解决方案

    打開VS莫名其妙地彈出下面的錯誤框: "the security key for this program currently stored on your system does not ...

  7. 克罗内克符号kronecker_delta

    Kronecker delta 克罗内克函数 Wiki 维基百科 Kronecker delta 定义 \[\delta _{{ij}}={\begin{cases}0&{\text{if } ...

  8. MySql主键不区分大小写问题、查询不区分大小写问题

    一.问题一:MySql默认主键不区分大小写 实例: -- 创建混合类型 create table PlainText( Content nvarchar(50) , primary key(Conte ...

  9. 面试知识点——Java

    目录 Java容器 hashmap实现原理 java多线程 jvm内存模型 java 垃圾回收机制 对象存活状态检查 垃圾收集算法 垃圾收集器 内存分配与回收策略 java nio Java容器 ha ...

  10. python网络编程(四)

    TFTP客户端 1. TFTP协议介绍 TFTP(Trivial File Transfer Protocol,简单文件传输协议) 是TCP/IP协议族中的一个用来在客户端与服务器之间进行简单文件传输 ...