如何实现c++返回char**值传给C#
发表于:2025-01-21 作者:千家信息网编辑
千家信息网最后更新 2025年01月21日,本篇内容主要讲解"如何实现c++返回char**值传给C#",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"如何实现c++返回char**值传给C#"吧!ch
千家信息网最后更新 2025年01月21日如何实现c++返回char**值传给C#
本篇内容主要讲解"如何实现c++返回char**值传给C#",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"如何实现c++返回char**值传给C#"吧!
char **arr; int arrlen,arrcol;templatevoid make2DArray(T** &ptr, int rows, int cols){ //创建二维数组,先创建行指针 ptr = new T*[rows]; //再为每一行分配空间 for (int i = 0; i < rows; i++) { ptr[i] = new T[cols]; }}void alloc2D(){ arrlen = 3; arrcol = 2; arr = new char*[arrlen];//分配3个元素的数组空间,每个元素是char*指针元素 for (int i = 0; i <= arrlen; i++) { arr[i] = new char[arrcol*(i+1)+1]; //其实不同行可以长度不同 }}void* returnpptr(int* len) //C++分配内存,返回**给C# { alloc2D(); *len = 3; for (int i = 0; i < arrlen; i++) { for (int j = 0; j <= arrcol*(i + 1)+1; j++) { if (j == arrcol*(i + 1)+1) arr[i][j] = 0; else arr[i][j] = (char)(0x31 + i + j % 5); } } return arr;}
[DllImport("dllfordebugdemo.dll", EntryPoint = "returnpptr", CallingConvention = CallingConvention.Cdecl)] public static extern IntPtr returnpptr(ref int len); private void button7_Click(object sender, EventArgs e) { int len =0; IntPtr p = returnpptr(ref len); IntPtr[] ps = new IntPtr[len]; for(int i =0;i显示如下:
123
23456
3456734如果C++返回的是int**,实验如下:
int** ppcol;int* p1;int reflen;void* returnpptrint(int* len){ reflen = 1; *len = reflen; arrcol = 2; p1 = &arrcol; if (ppcol == NULL) { ppcol = &p1; } return ppcol;}[DllImport("dllfordebugdemo.dll", EntryPoint = "returnpptrint", CallingConvention = CallingConvention.Cdecl)] public static extern IntPtr returnpptrint(ref int len);private void button7_Click(object sender, EventArgs e) { int len =0; IntPtr p = returnpptrint(ref len); IntPtr[] ps = new IntPtr[len]; int[] lens = new int[len]; for (int i = 0; i < len; i++) { ps[i] = Marshal.ReadIntPtr(p + Marshal.SizeOf(typeof(IntPtr)) * i); Marshal.Copy(ps[i],lens,0,1); Console.WriteLine("lens[i]=" + lens[i]); } }显示:
lens[i]=2
总结:
C#无法接收C++返回值的char**/int**,只能先强转为void*,然后在C#中public static extern IntPtr fun(...),实际使用时二级指针的行数,并且通过IntPtr[]数组和Marshal.ReadIntPtr(基址+偏址),再用Marshal.Copy或PtrToString...方式获取最终值。
到目前为止:三级指针不管是参数还是返回值形式,都不成功(估计还是以后有时间再做实验)。
上面统一以c# IntPtr接收C++的void*(实际是char**/int**强转而来),虽然实验成功,但换种思维方式,c++中还是char**/int** fun(...),而c#中以IntPtr fun(...)可不可以呢?
[DllImport("dllfordebugdemo.dll", EntryPoint = "returnpptr", CallingConvention = CallingConvention.Cdecl)] public static extern IntPtr returnpptr(ref int len);private void button7_Click(object sender, EventArgs e) { int len =0; IntPtr p = returnpptr(ref len); IntPtr[] ps = new IntPtr[len]; for (int i = 0; i < len; i++) { ps[i] = Marshal.ReadIntPtr(p + Marshal.SizeOf(typeof(IntPtr)) * i); Console.WriteLine(Marshal.PtrToStringAnsi(ps[i])); }}void** returnpptr(int* len) //C++分配内存,返回**给C#{ alloc2D(); *len = 3; for (int i = 0; i < arrlen; i++) { for (int j = 0; j <= arrcol*(i + 1)+1; j++) { if (j == arrcol*(i + 1)+1) arr[i][j] = 0; else arr[i][j] = (char)(0x31 + i + j % 5); } } return (void**)arr;}或者将返回值改为实际的char**:char** returnpptr(int* len) //C++分配内存,返回**给C#{ alloc2D(); *len = 3; for (int i = 0; i < arrlen; i++) { for (int j = 0; j <= arrcol*(i + 1)+1; j++) { if (j == arrcol*(i + 1)+1) arr[i][j] = 0; else arr[i][j] = (char)(0x31 + i + j % 5); } } return (arr;}C#中还是IntPtr returnpptr(ref int len),最终实验也是成功的。
到此,相信大家对"如何实现c++返回char**值传给C#"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
C#
分配
c++
实际
指针
还是
实验
成功
元素
内存
数组
C++
j++
内容
方式
空间
c#
学习
不同
实用
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
广州编程软件开发价格
网络安全公司的性质
最近的热门创造服务器
服务器不启动断电
怎么通过hex修复数据库
香港中博网络技术有限公司
英特尔软件开发待遇
北京车网互联网科技
云南计算机网络技术学校
QT导入数据库的方式以及步骤
股票数据存在什么数据库中
辽宁北斗卫星授时服务器云空间
收录数据库名称指
苹果手机电话录音软件开发
阿里云服务器资源管理器
可以连接数据库的编译软件
搜狐电视直播软件开发
海南充电式铆钉枪软件开发
张晓月中信银行北京软件开发
fm2020数据库更新方法
软件开发的过程计划
清理数据库缓存工具
刚毕业的软件开发学生私活
用服务器搭建大淘客cms
太仓正规软件开发口碑
互联网科技金融企业排名
腾讯网络安全中心电话
办公室用服务器
wow任务网络安全
网络安全检测收费标准