博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#调用C++DLL 结构体 含有 char[] 为乱码
阅读量:5333 次
发布时间:2019-06-15

本文共 2459 字,大约阅读时间需要 8 分钟。

2019年的4月23号  今天天气 没有了前几天的惠风和畅  但仍是天朗气清 

 来邦对讲SDK二次开发SDK文档如下:

1. 数据存放的所需结构体(对讲设备出现呼叫挂断等动作时,回调函数所需)

 

2. 32位C++方法(32位还是64位提前确认)

 //用来初始化SDK类库

  //用来注册回调函数

 //具体回调函数内容

C#二次调用开发:

 

[UnmanagedFunctionPointerAttribute(CallingConvention.StdCall)]        public delegate void ACTION_CALLBACK(lb_event_message_e userEvent, IntPtr wParam, IntPtr userData);     public class LonBonFun             {                            [DllImport("lb_sdk_universal.dll")]         public static extern int lb_initialServer(string serverIp, int svrPort);  //初始化           [DllImport("lb_sdk_universal.dll")]         public static extern int lb_CallActionNotify(ACTION_CALLBACK callback, IntPtr userData);  //注册回调函数            [DllImport("lb_sdk_universal.dll")]        public static extern int lb_releaseServer();  //释放SDK    }
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]          public struct ActionParam        {            public int sender; // 发送端            public int receiver; // 接收端            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 1024)]            public string acceptBc; // 广播接收端            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]            public string SessionId; // 会话标识            public int broadId; // 广播组序(标识)/门磁编号            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 512)]            public string rdFile; // 录音文件名              public int atmTerNum; // Atm编号           }
class Program    {          public static ACTION_CALLBACK callback ;            static void Main(string[] args)          {               int result = LonBonFun.lb_initialServer("192.168.1.94", 5160);             Console.WriteLine("已完成初始化");            callback = callFun;            LonBonFun.lb_CallActionNotify(callback, (IntPtr)0);             Console.ReadKey();          }          static private void callFun(lb_event_message_e userEvent, IntPtr wParam, IntPtr userData)         {            if (userEvent == 9 || userEvent == 10)              {                ActionParam tActionParam = new ActionParam();                tActionParam = (ActionParam)Marshal.PtrToStructure(wParam,typeof(ActionParam));                Console.WriteLine(tActionParam.rdFile);               }            }        }

注:到这里正文开始了,博主原先在C#结构体中 CharSet 属性为 CharSet.Unicode ,导致在回调里拿到  tActionParam.rdFile 是乱码改为CharSet.Ansi 问题解决。

原因: 首先结构体CharSet属性 是决定字符串封送的方式,共有三种。Unicode将字符串封送为Unicode格式,Ansi为字符串封送为Ansi格式,Auto将字符串随机应变封送

 

 

转载于:https://www.cnblogs.com/HansZimmer/p/10757043.html

你可能感兴趣的文章
win8.1安装Python提示缺失api-ms-win-crt-runtime-l1-1-0.dll问题
查看>>
mysql授权grant
查看>>
图片点击轮播(三)-----2017-04-05
查看>>
【乱搞】【AOJ-574】爱就大声说出来
查看>>
RESTful记录-RESTful服务
查看>>
工程项目缺少C文件会怎么样?STM32 flasher
查看>>
Clojure编写一个阶乘程序 使用递归
查看>>
zbb20190703 搭建vue工程并配置idea开发工具
查看>>
Android Studio的git功能的使用介绍
查看>>
【转载】Vim查找替换及正则表达式的使用
查看>>
u3D大场景的优化
查看>>
CodeForces 180C Letter
查看>>
[原]SQL相关路径查询脚本
查看>>
【进程线程与同步】5.3 创建与联接线程
查看>>
判断两个字符串是否相等【JAVA】
查看>>
解决jQuery的$符号的冲突问题
查看>>
使用Javascript Ajax 通信操作JSON数据 [下]
查看>>
永久重定向
查看>>
2.1
查看>>
python_根据"词库"进行“词联想”
查看>>