当前位置: 首页 > news >正文

C#调用C++ 的DLL传送和接收中文字符串

1 c#向c++传送中文字符串

设置:将 字符集 改为 使用多字节字符集
在这里插入图片描述

cpp代码:

extern "C"_declspec(dllexport) int input_chn_str(char in_str[])
{cout<<in_str<<endl;return 0;
}

c#代码:

[DllImport("Demo.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
public static extern bool input_chn_str(byte[] in_str);string str = "中国chn123"; 
int rst = input_chn_str(Encoding.Default.GetBytes(str));

2 C#接收c++返回的中文字符串

cpp代码:

extern "C"_declspec(dllexport) int ProcessChineseString(const char* input, char* output)
{std::string inputString(input);std::string outputString = "输入内容为:" + inputString;strcpy(output, outputString.c_str());return 0;
}

c#代码:

[DllImport("ocr_cpu.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)]
extern static int ProcessChineseString(IntPtr input1, IntPtr output1);string chineseInput = "你好123abc不不不";
byte[] inputBytes = Encoding.Default.GetBytes(chineseInput);
IntPtr inputPtr = Marshal.AllocHGlobal(inputBytes.Length + 1);
Marshal.Copy(inputBytes, 0, inputPtr, inputBytes.Length);
Marshal.WriteByte(inputPtr, inputBytes.Length, 0); // 添加字符串结束符IntPtr outputPtr = Marshal.AllocHGlobal(1000);
ProcessChineseString(inputPtr, outputPtr);
string outputString = Marshal.PtrToStringAnsi(outputPtr);Console.WriteLine(outputString);Marshal.FreeHGlobal(inputPtr);
Marshal.FreeHGlobal(outputPtr);

如果遇到乱码:

[DllImport("ocr_cpu.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)]extern static int infer(IntPtr output);IntPtr outputPtr = Marshal.AllocHGlobal(1000);rst = infer(outputPtr);{int length = 0;//循环查找字符串的长度 while (Marshal.ReadByte(outputPtr + length) != 0){length++;}byte[] strbuf = new byte[length];Marshal.Copy(outputPtr, strbuf, 0, length);// Taken from https://msdn.microsoft.com/it-it/library/system.text.encodinginfo.getencoding(v=vs.110).aspx string message1 = Encoding.UTF8.GetString(strbuf);Console.WriteLine(message1);}
http://www.lryc.cn/news/205952.html

相关文章:

  • 【MySQL】数据库常见错误及解决
  • spring常见问题汇总
  • java8 Lambda表达式以及Stream 流
  • 基于Java的音乐网站管理系统设计与实现(源码+lw+部署文档+讲解等)
  • 【蓝桥】小蓝的疑问
  • 漏洞复现-海康威视综合安防管理平台信息泄露【附Poc】
  • 【完美世界】被骂国漫之耻,石昊人设战力全崩,现在真成恋爱世界了
  • 34二叉树-BFS和DFS求树的深度
  • Android Glide判断图像资源是否缓存onlyRetrieveFromCache,使用缓存数据,Kotlin
  • 设计模式之创建型模式
  • 使用jdbc技术连接数据库
  • OpenLayers入门,快速搭建vue+OpenLayers地图脚手架项目
  • 完成比写得好更重要,先完成初稿再说
  • Spring boot 处理复杂json接收,同种类型、不同场景处理
  • 排列置换环上构造:1025T3
  • Stable diffusion的一些参数意义及常规设置
  • 成员变量、静态成员变量、局部变量、常量的内存区域
  • 网络协议--IGMP:Internet组管理协议
  • 网络安全https
  • xcode Simulator 手动安装
  • Unity中国、Cocos为OpenHarmony游戏生态插上腾飞的翅膀
  • Monaco Editor编辑器
  • ARM | 传感器必要总线IIC
  • Mybatis中Resources和ClassLoaderWrapper
  • Linux多线程服务端编程:使用muduo C++网络库 学习笔记 第三章 多线程服务器的适用场合与常用编程模型
  • windows下使用FFmpeg开源库进行视频编解码完整步聚
  • 如何更改eclipse的JDK版本
  • HarmonyOS第一课运行Hello World
  • 解决el-tooltip滚动时悬浮框相对位置发生变化
  • Java精品项目源码第61期汽车零件销售商城系统(代号V063)