zoukankan      html  css  js  c++  java
  • C#调用C++接口返回字符串的做法

    作者:朱金灿

    来源: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++接口示例

  • 相关阅读:
    attachEvent 中this指向
    JS window.name跨域封装
    【javascript基础】8、闭包
    【javascript基础】7、继承
    【javascript基础】6、new与构造函数
    【javascript基础】5、创建对象
    【javascript基础】4、原型与原型链
    【javascript基础】3、变量和作用域
    【javascript基础】2、函数
    【javascript基础】1、基本概念
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6469898.html
Copyright © 2011-2022 走看看