【该方法本人实践成功(推荐)】Cstring 和 const char* , unicode和ANSI编码 的一个具体应用

参考文章如下:

l 网上流传甚广的一个大牛写的“关于CString的技巧”,没能找到原文,转载地址如下http://blog.csdn.net/coolstar14/archive/2004/07/15/41885.aspx

l CodeProject上一篇“CString Managment”地址:    http://www.codeproject.com/KB/string/cstringmgmt.aspx

l CodeProject上的FAQ里的一些解答:http://www.codeproject.com/KB/cpp/cppforumfaq.aspx#mfc_cstrtopchar

l MSDN里关于WideCharToMultiByte()函数的说明及例子。

背景:

1.       Unicode环境

2.       CSmtp类是从网上下载的一个类,实现了利用smtp协议发送邮件。具有很多方法,可以设置帐户名、密码等,对应的方法为CSmtp::SetLogin(const char*)、CSmtp::SetPassword(const char*)等。因为是别人的作品,我并无能力改写这些函数的参数类型。

问题

1.       CString——>const char*:将Edit控件里用户输入的字符串,保存到Cstring类型的控件变量里。经过处理,然后将此字符串作为函数m_CSmtpMail.SetLogin(const char*)的参数输入。

2.       const char*——>LPCTSTR:将捕捉异常函数e.GetErrorText().c_str()的结果转换为LPCTSTR,作为MessageBox(LPCTSTR)函数的参数。

解决:

对于第一个问题:

1:先将Cstring变量转换为Unicode 的字符指针,即TCHAR*

2:再利用WideCharToMultiByte()函数将unicode字符串转换为ANSI字符串

3.       将转换后的结果字符串传递给SetLogin(const char*)函数,MFC根据参数类型要求,自动将char * 转换成const char*

代码如下:

1 // m_EditAccount为控件变量
2 // m_CSmtpMail为CSmtp对象
3 TCHAR *  tempAct  =  m_EditAccount.GetBuffer();
4 char  mbTempAct[ 256 ];
5 WideCharToMultiByte( 0 , 0 ,tempAct, - 1 ,mbTempAct, 100 ,Null,Null);
6 m_CSmtpMail.SetLogin(mbtempAct);

对于第二个问题:

1. e.GetErrorText().c_str()的结果实际上是一个字符数组的首地址指针,一个const char*类型。利用Cstring的构造函数,可以很容易的将一个字符指针转换为Cstring类型。

2.将Cstring类型传递给MessageBox()。MFC根据参数类型要求,利用LPCTSTR操作符,自动将Cstring转换为LPCTSTR类型。LPCTSTR与CString的转换就是这么简单,这一点在很多讲解的Cstring的文章里都可以找到。

3.相比第一个问题,这里少掉了ANSI编码到unicode编码相互转换的过程。这应该是Cstring类封装完善的缘故,在构造函数Cstring str4(e.GetErrorText().c_str())这一步自动完成了。

代码如下:

1 Cstring cstr4(e.GetErrorText().c_str());
2MessageBox(cstr4);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值