作者:朱金灿

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

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

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

 #region 本段代码可放在其他位置,但保证系统启动后能初始化
static protected StringHelper swigStringHelper = new StringHelper(); // 系统初始化时先调用
protected class StringHelper
{
public delegate string StringDelegate(string message);
static StringDelegate stringDelegate = new StringDelegate(CreateString);
// AlgoDemo为C++模块,RegisterStringCallback为创建字符串的注册回调函数
[DllImport("AlgoDemo", EntryPoint = "RegisterStringCallback")]
public static extern void RegisterStringCallback(StringDelegate stringDelegate); static string CreateString(string cString)
{
return cString;
} static StringHelper()
{
RegisterStringCallback(stringDelegate);
}
} // C#程序调用处
private void btnExcute_Click(object sender, EventArgs e)
{
string strOut = "";
string strResult = Algo.ExcuteAlgo("C#调用C++测试!", 0, ref strOut);
MessageBox.Show(strOut);
}

// C++模块的注册回调函数
typedef char * (__stdcall* StringHelperCallback)(const char *);
static StringHelperCallback g_csharp_string_callback = NULL; extern "C" __declspec(dllexport) void RegisterStringCallback(StringHelperCallback callback) {
g_csharp_string_callback = callback;
}
// C++接口
char* ExcuteAlgo(const char* strFileName,int arg0,char** strOut)
{
char* result;
TestAlgo algo;
std::string strInput(strFileName);
std::string strResult = algo.DoSomething(strFileName,arg0); // 此处需要注意,由调用方开辟空间
result = "中文测试!!";
std::string strTemp = "输出字符串测试。。。";
for(int i=0;i<500;i++)
{
strTemp += "多加一点数据...!!";
} if(NULL==g_csharp_string_callback)
return NULL; // 把C++字符串传递给空的C#字符串
*strOut = g_csharp_string_callback(strTemp.c_str()); return result;
}

代码示例工程见: 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. Day04:函数参数、对象、嵌套、闭包函数和装饰器

    上节课复习:    1.什么是函数        函数就是具备某一功能的工具    2.为何用函数        1.程序的组织结构和可读性        2.减少代码冗余        3.扩展性强 ...

  2. JSP环境探针-当前电脑所有系统参数

    1 <%@ page contentType="text/html;charset=gb2312" %> <%@ page import="java.u ...

  3. <正则吃饺子> :关于redis集群的测试demo

    redis集群的测试demo,来自网络,具体不详. 1.下载地址,如下:http://download.csdn.net/detail/u012543819/9729291 2.项目是java项目,结 ...

  4. Elasticsearch学习概念之curl

    curl,简单认为是可以在命令行下访问url的一个工具.即增删改查. curl是利用URL语法在命令行方式下工作的开源文件传输工具,使用curl可以简单实现常见的get/post请求. 查看curl的 ...

  5. EasyUI把datagrid的值赋给表单

    $('#infoForm${INDEX}').form('load', rowToDto(pageConfig${INDEX}.infoName, row)); function rowToDto(i ...

  6. Primer回顾 数组和指针

    数组和指针类似于vector和迭代器. 区别在于:数组的长度是固定的.数组一经创建,就不允许添加新的元素.指针则可以像迭代器一样用于遍历和检查数组中的元素. 设计良好的程序只有在强调速度时才在类实现的 ...

  7. 《精通Spring4.X企业应用开发实战》读后感第四章(BeanFactory生命周期)

    package com.smart; import org.springframework.beans.BeansException; import org.springframework.beans ...

  8. 模块 DLL C:\WINDOWS\system32\inetsrv\aspnetcore.dll 未能加载。返回的数据为错误信息。

    更新了win10的版本后,就启动原来的iis发布的程序 程序池就自动关闭.后来 启动网站 iis程序池自动关闭. 在为应用程序池“.NET v4.5”提供服务的工作进程“21908”中,协议“http ...

  9. 天梯赛L2-006. 树的遍历L3-010. 是否完全二叉搜索树

    L2-006. 树的遍历 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历 ...

  10. 一、初识mybatis

    orm框架 1.配置文件(配置别名.mapper xml文件.数据库连接.事务) 2.创建SqlSessionFactory,创建SqlSession 3.创建model,创建Mapper xml文件 ...