作者:朱金灿

来源:http://blog.csdn.net/clever101

现在有这样一种情景,假如C#调用C++接口需要返回一个字符串。因为字符串是不定长的,因此传递一个定长的字符串进去是不合适的。

因此需要一种间接的做法,简单来说就是C#定义一个创建空字符串的接口,传递这个接口指针给C++模块,然后在C++模块中调用这个C#接口创建一个空的字符串接口。然后在传递字符串时先调用这个C#接口创建一个空字符串,然后再填充字符串。具体的代码如何:

  1. #region 本段代码可放在其他位置,但保证系统启动后能初始化
  2. static protected StringHelper swigStringHelper = new StringHelper(); // 系统初始化时先调用
  3. protected class StringHelper
  4. {
  5. public delegate string StringDelegate(string message);
  6. static StringDelegate stringDelegate = new StringDelegate(CreateString);
  7. // AlgoDemo为C++模块,RegisterStringCallback为创建字符串的注册回调函数
  8. [DllImport("AlgoDemo", EntryPoint = "RegisterStringCallback")]
  9. public static extern void RegisterStringCallback(StringDelegate stringDelegate);
  10.  
  11. static string CreateString(string cString)
  12. {
  13. return cString;
  14. }
  15.  
  16. static StringHelper()
  17. {
  18. RegisterStringCallback(stringDelegate);
  19. }
  20. }
  21.  
  22. // C#程序调用处
  23. private void btnExcute_Click(object sender, EventArgs e)
  24. {
  25. string strOut = "";
  26. string strResult = Algo.ExcuteAlgo("C#调用C++测试!", 0, ref strOut);
  27. MessageBox.Show(strOut);
  28. }

  1. // C++模块的注册回调函数
  2. typedef char * (__stdcall* StringHelperCallback)(const char *);
  3. static StringHelperCallback g_csharp_string_callback = NULL;
  4.  
  5. extern "C" __declspec(dllexport) void RegisterStringCallback(StringHelperCallback callback) {
  6. g_csharp_string_callback = callback;
  7. }
  8. // C++接口
  9. char* ExcuteAlgo(const char* strFileName,int arg0,char** strOut)
  10. {
  11. char* result;
  12. TestAlgo algo;
  13. std::string strInput(strFileName);
  14. std::string strResult = algo.DoSomething(strFileName,arg0);
  15.  
  16. // 此处需要注意,由调用方开辟空间
  17. result = "中文测试!!";
  18. std::string strTemp = "输出字符串测试。。。";
  19. for(int i=0;i<500;i++)
  20. {
  21. strTemp += "多加一点数据...!!";
  22. }
  23.  
  24. if(NULL==g_csharp_string_callback)
  25. return NULL;
  26.  
  27. // 把C++字符串传递给空的C#字符串
  28. *strOut = g_csharp_string_callback(strTemp.c_str());
  29.  
  30. return result;
  31. }

代码示例工程见: C#调用C++接口示例

C#调用C++接口返回字符串的做法的更多相关文章

  1. 调用WebService接口返回字符串

    Service service = new Service(); Call call = (Call) service.createCall(); call.setTargetEndpointAddr ...

  2. ATL接口返回类型&&ATL接口返回字符串BSTR*

    感觉在ATL中做COM组件,添加方法的时候,其返回值只能是HRESULT,我想返回其他数据类型,可以吗? 非也非也 HRESULT指示返回的状态,即正确与否, 返回值是这样的 HRESULT MyMe ...

  3. java通过url调用远程接口返回json数据

    java通过url调用远程接口返回json数据,有用户名和密码验证, 转自 https://blog.csdn.net/wanglong1990421/article/details/78815856 ...

  4. Java中使用JSONTokener判断接口返回字符串是JSONObject还是JSONArray

    今天在接口对接中,遇到一个问题,对方接口返回的JSONString,类型不确定,所以需要先做判断再进行处理.查阅资料后使用JSONTokener可进行处理,特此记录. String ret = ord ...

  5. linux下bom头导致的php调用php接口 返回的json字符串 无法转成 数组,即json字符串无法解码的问题

    今天很是郁闷,写了一个php接口,返回的是标准的json字符串,但是调用的php 就是无法json_decode(),返回错误码为4,最后终于找到原因,原来是蒙一个文件中有bom头,最后采用一个命令 ...

  6. 关于C# webapi ,接口返回字符串和json格式 ,返回值中有反斜杠

    最近遇到一个比较郁闷的问题,记录一下 写了一个接口,想返回json 数据,但是返回值中总是带有反斜杠... ,下面来看原因 首先,配置 webapi的路由 App_Start 文件夹下 ,WebApi ...

  7. 前端调用后端接口返回200(成功状态码),后端有返回,但是控制台Network Response为空,没展示任何信息

    解决方法: 1.在js里面debugger,可以看到后台是否有返回数据. 2.直接console.log(),直接把返回值打印出来,查看返回的数据格式,方便前端进行数据的处理. PS:因为后端返回的数 ...

  8. C#调用Delphi Dll返回字符串的示例(使用Move才能拷贝字符串)

    //----------------------Delphi------------------- procedure GetSqlData(ASource: PChar; ADest: PChar; ...

  9. C#调用接口返回json数据中含有双引号 或其他非法字符的解决办法

    这几天,调用别人接口返回json数据含有特殊符号(双引号),当转换成json对象总是报错, json字符格式如下 { "BOXINFO":[ { ", "ITE ...

随机推荐

  1. linux——boot空间不足

    1. 先用df命令,查看磁盘分区情况 2. dpkg --get-selections|grep linux-image(查看更新了多少内核) root@ubuntu:/home/hadoop# dp ...

  2. css3 翻起页脚

    html <div class="demo2"> <img src="images/1.jpg"> </div> css . ...

  3. H+ Se7en WebUI

    http://www.zi-han.net/theme/hplus/webim.html

  4. 数据字典生成工具(生成Excel, Word,PDF,html)

    转自:http://www.cnblogs.com/yanweidie/p/3838765.html 数据字典生成工具之旅系列文章导航 数据字典生成工具之旅系列文章导航 宣传语 数据字典生成工具.数据 ...

  5. Druid 在spring中的配置

    Spring配置中dataSource配置 <bean id="dataSource" class="com.alibaba.druid.pool.DruidDat ...

  6. HDU 5546 Ancient Go (搜索)

    题意: Alice和Bob正在下古代围棋,规则如下: 棋盘有8×8个格子,棋子下在棋盘的交叉点上,故可以有9×9个落子的位置 Alice执黑棋Bob执白棋轮流落子 与棋子直线相连的空白交叉点叫做气.当 ...

  7. JAVA基础学习-集合三-Map、HashMap,TreeMap与常用API

    森林森 一份耕耘,一份收获 博客园 首页 新随笔 联系 管理 订阅 随笔- 397  文章- 0  评论- 78  JAVA基础学习day16--集合三-Map.HashMap,TreeMap与常用A ...

  8. “MVC+Nhibernate+Jquery-EasyUI”信息发布系统 第二篇(数据库结构、登录窗口、以及主界面)

    一.在上一篇文章中,主要说的就是把主框架搭建起来,并且Nhibernate能达到增删改查的地步.测试好之后再来看这篇文章,我的主框架相对来说简答一点,重点还是实现系统的功能,以及对Jquery-Eas ...

  9. MS SQL的CASE...WHEN...THEN...END语法

    根据多个可能的答案检查一个值或变量. 举例说明: SELECT [type],CASE [type] WHEN 'TT' THEN 'TYPE_TABLE' WHEN 'FN' THEN 'SQL_S ...

  10. 3dmax室内设计,建筑视频

    第一教程篮球场 http://video.1kejian.com/video/?30800-0-1.html 第一课 元素级别-flip反转(直接看模型里面) 第二课 alt+r = ring crt ...