最近在做一些关于VC的ActiveX小插件,经常会遇到字符串处理的问题,狂查CSDN和MSDN,结果并不理想。先说明一下,相关处理函数在VC++6.00测试通过。也许很多人不能理解,现在都什么年代了,还用VC6.0,其实VC开发插件有一个好处就是部署的时候方便一些,不用考虑浏览器端用户是否安装了.net Framework。那个.net Framework随着推出新版本越来越大,要让用户花那么多时间去安装那个庞然大物,而实际用到的东西却很少很少,这样很多人会不干的。另外,服务端的是java开发的,要加上.net更加不可能。因此,VC开发的东西就不用担心这些东西。说多了。。。。。

在VC编程中经常会遇到字符串转化的问题,现在做一下总结,以方便以后使用。

(1) char*转换成CString
  若将char*转换成CString,除了直接赋值外,还可使用CString::Format进行。例如:
char chArray[] = "Char test";
TCHAR * p = _T("Char test");( 或LPTSTR p = _T("Char test");)
CString theString = chArray;
theString.Format(_T("%s"), chArray);
theString = p;

(2) CString转换成char*

 若将CString类转换成char*(LPSTR)类型,常常使用下列三种方法:

 方法一,使用强制转换。例如:

CString theString( (_T("Char test "));
LPTSTR lpsz =(LPTSTR)(LPCTSTR)theString;

 方法二,使用strcpy。例如:

CString theString( (_T("Char test "));
LPTSTR lpsz = new TCHAR[theString.GetLength()+1];
_tcscpy(lpsz, theString);

  需要说明的是,strcpy(或可移值的_tcscpy)的第二个参数是 const wchar_t* (Unicode)或const char*
(ANSI),系统编译器将会自动对其进行转换。

 方法三,使用CString::GetBuffer。
如果你需要修改 CString 中的内容,它有一个特殊的方法可以使用,那就是 GetBuffer,它的作用是返回一个可写的缓冲指针。
如果你只是打算修改字符或者截短字符串,例如:
CString s(_T("Char test "));
LPTSTR p = s.GetBuffer();
LPTSTR dot = strchr(p, ''.'');
// 在这里添加使用p的代码
if(p != NULL)
*p = _T('\0');
s.ReleaseBuffer(); // 使用完后及时释放,以便能使用其它的CString成员函数
在 GetBuffer 和 ReleaseBuffer 之间这个范围,一定不能使用你要操作的这个缓冲的 CString 对象的任何方法。因为
ReleaseBuffer 被调用之前,该 CString 对象的完整性得不到保障。

其他常规转换

先定义一些常见类型变量借以说明
int i = 100;
long l = 2001;
float f=300.2;
double d=12345.119;
char username[]="xx";
char temp[200];
char *buf;
CString str;

一、其它数据类型转换为字符串
短整型(int)
itoa(i,temp,10); /将i转换为字符串放入temp中,最后一个数字表示十进制
itoa(i,temp,2); //按二进制方式转换
长整型(long)
ltoa(l,temp,10);

二、从其它包含字符串的变量中获取指向该字符串的指针
CString变量
str = "2008北京奥运";
buf = (LPSTR)(LPCTSTR)str;
BSTR类型的_variant_t变量
v1 = (_bstr_t)"程序员";
buf = _com_util::ConvertBSTRToString((_bstr_t)v1);

三、字符串转换为其它数据类型
strcpy(temp,"123");
短整型(int)
i = atoi(temp);
长整型(long)
l = atol(temp);
浮点(double)
d = atof(temp);

四、其它数据类型转换到CString
使用CString的成员函数Format来转换,例如:
整数(int)
str.Format("%d",i);
浮点数(float)
str.Format("%f",i);

字符串指针(char *)等已经被CString构造函数支持的数据类型可以直接赋值
str = username;

五、BSTR、_bstr_t与CComBSTR
  CComBSTR、_bstr_t是对BSTR的封装,BSTR是指向字符串的32位指针。 
char *转换到BSTR可以这样: BSTR
b=_com_util::ConvertStringToBSTR("数据");
//使用前需要加上头文件comutil.h
反之可以使用char *p=_com_util::ConvertBSTRToString(b);

六、variant转化为CString

 VariantToString(_variant_t varValue) 
  { 
    if(varValue.vt!=VT_BSTR) 
     {
       varValue.ChangeType(VT_BSTR); 
    }
    return (char*)_bstr_t(varValue.bstrVal); 
 }

注意:加上头文件 #include "comdef.h"

Variant 转化为Long方法

 

view sourceprint?01 VariantToLong(const VARIANT &var) 

02 { 

03  long r; 

04  switch(var.vt) 

05  { 

06  case VT_UI2://USHORT 

07  r = var.uiVal; 

08  break; 

09  case VT_UI4://ULONG 

10  r = var.ulVal; 

11  break; 

12  case VT_INT://INT 

13  r = var.intVal; 

14  break; 

15  case VT_UINT://UINT 

16  r = var.uintVal; 

17  break; 

18  case VT_I4://LONG 

19  r = var.lVal; 

20  break; 

21  case VT_UI1://BYTE 

22  r = var.bVal; 

23  break; 

24  case VT_I2://SHORT 

25  r = var.iVal; 

26  break; 

27  case VT_R4://FLOAT 

28  r = (long)var.fltVal; 

29  break; 

30  case VT_R8://DOUBLE 

31  r = (long)var.dblVal; 

32  break; 

33  default: 

34  r = -1;//无法转换该值 

35  break; 

36  } 

37  return r; 

38 }


本文来自博客园-陈国立:http://www.divmy.com   原文地址:http://www.cnblogs.com/cgli/archive/2011/01/20/1940378.html