在c++中回调c#函数遇到的字符串问题

来源:互联网 发布:换手率选股软件 编辑:程序博客网 时间:2024/05/16 05:05

  在工作中需要在c++代码中回调c#写的一个函数,但这个函数返回的是字符串。以前的c++代码是使用MBMS编译的,没有发现什么问题。但现在c++代码升级后改为了unicode编译,结果问题出来了。

  在c++代码中有LPCTSTR res = funcXXX();此时res中全是乱码,在内存中观察,发现返回的字符串是ANSI类型的,当作UNICODE使用时自然是乱码了。

  在MSDN中阅读了关于互操作的文档,发现并没有针对c++回调C#的注意事项说明,于是网上GOOGLE,发现了蛛丝马迹。原来在这种情况下,并未指明如果使用返回的c# string。可能是在从.net返回到native时,自动的转换为ANSI类型。这是应该是指明返回类型为IntPtr。示例如下:

 

   【C#函数】

     public static IntPtr Report(IntPtr _x)
        {
            string x = Marshal.PtrToStringUni(_x);
            string res = x + x;
            return Marshal.StringToCoTaskMemUni(res);
        }

 

   【C++函数】

    PINVOKETESTDLL_API int doCallback()
   {
        if (g_callback)
       {
            LPCTSTR info = g_callback(strInfo);
           int l = 0;  //在此断下后观察info。
        }
       return 0;
   }

 

  在阅读StringToCoTaskMemUni()文档后,觉得在c++代码中还是应通过CoTaskFree()来说释放得到的字符串。

原创粉丝点击