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

  在工作中需要在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()来说释放得到的字符串。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值