登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

秒大刀 博客

好好学习 天天向上

 
 
 

日志

 
 
 
 

将托管字符串转换为非托管字符串  

2009-02-17 22:30:42|  分类: C/C++ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

        如果涉及到托管和非托管的互调用,则数据的拆装封送将会很重要。.net提供了System.Runtime.InteropServices.Marshal来实现托管类型和非托管类型之间的拆装封送。对于字符串的封送是经常要用到的,本例中以一个代理类CharPtrProxy来避免手工对Marshal返回的IntPtr进行维护,非常方便安全。

        平台:VS2005sp1 CLI

#pragma once
#include <string>
public ref class StringConvert
{
public:
    template<typename T>
    ref class CharPtrProxy
    {
    private:
        System::IntPtr m_intPtr;
    public:
        CharPtrProxy(System::IntPtr intPtr)
        {
            m_intPtr = intPtr;
        }
        ~CharPtrProxy()
        {
            System::Runtime::InteropServices::Marshal::FreeHGlobal(m_intPtr);
        }
        operator const T*()
        {
            return (const T*)m_intPtr.ToInt32();
        }
    };
public:
    static CharPtrProxy<char>^ ToAsciiCharPtr(System::String^ str)
    {
        return gcnew CharPtrProxy<char>(System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(str));
    }
    static CharPtrProxy<wchar_t>^ ToUnicodeCharPtr(System::String^ str)
    {
        return gcnew CharPtrProxy<wchar_t>(System::Runtime::InteropServices::Marshal::StringToHGlobalUni(str));
    }
    static std::string ToStdString(System::String^ str)
    {
        return std::string(ToAsciiCharPtr(str));
    }
    static std::wstring ToStdWString(System::String^ str)
    {
        return std::wstring(ToUnicodeCharPtr(str));
    }
};

 

2011-4-4
  VS2008以后可以采用marshal_as<T>更方便的转换。

参考:
    简单的单次转换可直接调用msclr::interop::marshal_as<To>(From)而无需构造marshal_context)(2011-12-26)

2012-7-19
    VS2005下也可以直接使用VS2008安装目录\VC\include\msclr下的头文件,反向兼容将托管字符串转换为非托管字符串 - 秒大刀 - 秒大刀 博客。当然能早日升级到最新的VS最好不过了。
  评论这张
 
阅读(1884)| 评论(1)

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018