BSTR、char* 和 CString 之间的转换 (转)

BSTR、char* 和 CString 之间的转换

 

 

  (1) char*转换成CString

  若将char*转换成CString,除了直接赋值外,还可使用CString::Format进行。例如:

char chArray[] = "This is a test";
char * p = "This is a test";

  或

LPSTR p = "This is a test";

  或在已定义Unicode应的用程序中

TCHAR * p = _T("This is a test");

  或

LPTSTR p = _T("This is a test");
CString theString = chArray;
theString.Format(_T("%s"), chArray);
theString = p;

  (2) CString转换成char*

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

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

CString theString( "This is a test" );
LPTSTR lpsz =(LPTSTR)(LPCTSTR)theString; 

  方法二,使用strcpy。例如:

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

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

  方法三,使用CString::GetBuffer。例如:

CString s(_T("This is a test "));
LPTSTR p = s.GetBuffer();
// 在这里添加使用p的代码
if(p != NULL) *p = _T('\0');
s.ReleaseBuffer();
// 使用完后及时释放,以便能使用其它的CString成员函数

  (3) BSTR转换成char*

  方法一,使用ConvertBSTRToString。例如:

#include
#pragma comment(lib, "comsupp.lib")
int _tmain(int argc, _TCHAR* argv[]){
BSTR bstrText = ::SysAllocString(L"Test");
char* lpszText2 = _com_util::ConvertBSTRToString(bstrText);
SysFreeString(bstrText); // 用完释放
delete[] lpszText2;
return 0;

  方法二,使用_bstr_t的赋值运算符重载。例如:

_bstr_t b = bstrText;
char* lpszText2 = b;

  (4) char*转换成BSTR

  方法一,使用SysAllocString等API函数。例如:

BSTR bstrText = ::SysAllocString(L"Test");
BSTR bstrText = ::SysAllocStringLen(L"Test",4);
BSTR bstrText = ::SysAllocStringByteLen("Test",4);

  方法二,使用COleVariant或_variant_t。例如:

//COleVariant strVar("This is a test");
_variant_t strVar("This is a test");
BSTR bstrText = strVar.bstrVal;

  方法三,使用_bstr_t,这是一种最简单的方法。例如:

BSTR bstrText = _bstr_t("This is a test");

  方法四,使用CComBSTR。例如:

BSTR bstrText = CComBSTR("This is a test");

  或

CComBSTR bstr("This is a test");
BSTR bstrText = bstr.m_str;

  方法五,使用ConvertStringToBSTR。例如:

char* lpszText = "Test";
BSTR bstrText = _com_util::ConvertStringToBSTR(lpszText);

  (5) CString转换成BSTR

  通常是通过使用CStringT::AllocSysString来实现。例如:

CString str("This is a test");
BSTR bstrText = str.AllocSysString();

SysFreeString(bstrText); // 用完释放 

  (6) BSTR转换成CString

  一般可按下列方法进行:

BSTR bstrText = ::SysAllocString(L"Test");
CStringA str;
str.Empty();
str = bstrText; 

  或

CStringA str(bstrText);

  (7) ANSI、Unicode和宽字符之间的转换

  方法一,使用MultiByteToWideChar将ANSI字符转换成Unicode字符,使用WideCharToMultiByte将Unicode字符转换成ANSI字符。

  方法二,使用“_T”将ANSI转换成“一般”类型字符串,使用“L”将ANSI转换成Unicode,而在托管C++环境中还可使用S将ANSI字符串转换成String*对象。例如:

TCHAR tstr[] = _T("this is a test");
wchar_t wszStr[] = L"This is a test";
String* str = S”This is a test”;

  方法三,使用ATL 7.0的转换宏和类。ATL7.0在原有3.0基础上完善和增加了许多字符串转换宏以及提供相应的类,它具有如图3所示的统一形式:

  其中,第一个C表示“类”,以便于ATL 3.0宏相区别,第二个C表示常量,2表示“to”,EX表示要开辟一定大小的缓冲。SourceType和DestinationType可以是A、T、W和OLE,其含义分别是ANSI、Unicode、“一般”类型和OLE字符串。例如,CA2CT就是将ANSI转换成一般类型的字符串常量。下面是一些示例代码:

LPTSTR tstr= CA2TEX<16>("this is a test");
LPCTSTR tcstr= CA2CT("this is a test");
wchar_t wszStr[] = L"This is a test";
char* chstr = CW2A(wszStr); 

  六、结语

  几乎所有的程序都要用到字符串,而Visual C++.NET由于功能强大、应用广泛,因而字符串之间的转换更为频繁。本文几乎涉及到目前的所有转换方法。当然对于.NET框架来说,还可使用Convert和Text类进行不同数据类型以及字符编码之间的相互转换。

http://www.cnblogs.com/justin/archive/2005/03/24/125057.html

 

天极播客全新上线 新鲜视频等你观看
作者:一介书生,仗剑漂流 阅读(3277) 评论(1)  编辑 发表于:2005-12-21 12:04
相关内容NET(C#)连接各类数据库-集锦
C#中一些字符串操作的常用用法 [转]
61条面向对象设计的经验原则
计算整数中1的个数的C语言实现
程序员的灯下黑:重知识轻技术
ARM ADS集成开发环境的使用 [二]
ARM ADS集成开发环境的使用
编程修养
手工打造PE文件
Path API
文章评论

# VC常用数据类型使用转换详解 [转] VC常用数据类型使用转换详解 [转]

//
CString -> char*
//
#include "atlbase.h"
CString strTmp;
char* cpTmp;
USES_CONVERSION
cpTmp=T2A(strTmp);
//
这是同事发现的最简单的办法!!!!
//


刚接触VC编程的朋友往往对许多数据类型的转换感到迷惑不解,本文将介绍一些常用数据类型的使用。

我们先定义一些常见类型变量借以说明

int i = 100;
long l = 2001;
float f=300.2;
double d=12345.119;
char username[]="女侠程佩君";
char temp[200];
char *buf;
CString str;
_variant_t v1;
_bstr_t v2;

一、其它数据类型转换为字符串


短整型(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 、_variant_t 与 COleVariant


VARIANT的结构可以参考头文件VC98\Include\OAIDL.H中关于结构体tagVARIANT的定义。
对于VARIANT变量的赋值:首先给vt成员赋值,指明数据类型,再对联合结构中相同数据类型的变量赋值,举个例子:
VARIANT va;
int a=2001;
va.vt=VT_I4;///指明整型数据
va.lVal=a; ///赋值

对于不马上赋值的VARIANT,最好先用Void VariantInit(VARIANTARG FAR* pvarg);进行初始化,其本质是将vt设置为VT_EMPTY,下表我们列举vt与常用数据的对应关系:

unsigned char bVal; VT_UI1
short iVal; VT_I2
long lVal; VT_I4
float fltVal; VT_R4
double dblVal; VT_R8
VARIANT_BOOL boolVal; VT_BOOL
SCODE scode; VT_ERROR
CY cyVal; VT_CY
DATE date; VT_DATE
BSTR bstrVal; VT_BSTR
IUnknown FAR* punkVal; VT_UNKNOWN
IDispatch FAR* pdispVal; VT_DISPATCH
SAFEARRAY FAR* parray; VT_ARRAY|*
unsigned char FAR* pbVal; VT_BYREF|VT_UI1
short FAR* piVal; VT_BYREF|VT_I2
long FAR* plVal; VT_BYREF|VT_I4
float FAR* pfltVal; VT_BYREF|VT_R4
double FAR* pdblVal; VT_BYREF|VT_R8
VARIANT_BOOL FAR* pboolVal; VT_BYREF|VT_BOOL
SCODE FAR* pscode; VT_BYREF|VT_ERROR
CY FAR* pcyVal; VT_BYREF|VT_CY
DATE FAR* pdate; VT_BYREF|VT_DATE
BSTR FAR* pbstrVal; VT_BYREF|VT_BSTR
IUnknown FAR* FAR* ppunkVal; VT_BYREF|VT_UNKNOWN
IDispatch FAR* FAR* ppdispVal; VT_BYREF|VT_DISPATCH
SAFEARRAY FAR* FAR* pparray; VT_ARRAY|*
VARIANT FAR* pvarVal; VT_BYREF|VT_VARIANT
void FAR* byref; VT_BYREF


_variant_t是VARIANT的封装类,其赋值可以使用强制类型转换,其构造函数会自动处理这些数据类型。
例如:
long l=222;
ing i=100;
_variant_t lVal(l);
lVal = (long)i;


COleVariant的使用与_variant_t的方法基本一样,请参考如下例子:
COleVariant v3 = "字符串", v4 = (long)1999;
CString str =(BSTR)v3.pbstrVal;
long i = v4.lVal;

 
 
 
文章出处:  
文章作者: 
收录时间:2008-2-13 23:31:05 申明:所有文章都是从网络上收集,若有侵权,
请联系:,我们会及时删除

转载于:https://www.cnblogs.com/alex_itxz/archive/2009/06/29/1513371.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/381296.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python打开音频文件_Python处理音频文件的实用姿势

每天叫醒我的不是理想&#xff0c;是楼下广场舞的音乐。音乐是人类的通用语言&#xff0c;不分国界不分种族。抖音短视频爆火的关键因素之一&#xff0c;就是普通人也能便捷地使用BGM表达自我。从感性角度看&#xff0c;音乐可以有很多种解释&#xff0c;如&#xff1a;音乐是有…

java三路快排,java二路快排很慢

老师&#xff0c;以下是我二路快排的java代码public class quickSortTwoway {public quickSortTwoway() {};public static void quickSort(Integer[] arr) {__quickSort(arr, 0, arr.length - 1);}private static void __quickSort(Integer[] arr, int l, int r) {if(l > r)…

Web开发常出现的错误[个人收集]

获取DataGrid中的每行中的第一行的第一个textbox (有点老&#xff0c;但用的到) publicabstractclassHelper { publicclassConvert { publicstaticTextBox ToTextBox(Control control) { TextBox tb control asTextBox; …

系统分析师资料_如何成为一名数据分析师?

随着大数据的逐渐普及&#xff0c;数据分析越来越普遍应用到各个职能岗位&#xff0c;也就是说&#xff0c;不论你在哪个行业&#xff0c;都会需要数据分析技能。数据岗位的薪资水涨船高&#xff0c;成为目前最有潜力的职业选择之一。根据猎聘发布《猎聘2019年中国AI&大数据…

matlab中ode45如何设置,如何使用Matlab中的ode45修正赋值错误(ode45函数的第488行)

我正在写一个脚本ode45为了整合卫星在火星附近双曲线轨道上的运动方程.我需要整合地球上的整个通道:从SOI半径开始(576000km)向行星前进,然后穿过大气层直到卫星到达opposite“大气边界(设置在250km从表面)。当它接收到输入A时tspan比大约高200000秒(我需要大约400000秒),Matla…

PL/SQL Developer 使用技巧小结(转)

1&#xff0c;右键菜单在PL/SQL Developer&#xff08;下面简称PLD&#xff09;中的每一个文本编辑窗口&#xff0c;如SQL Window&#xff0c;Command Window和Porgram Window&#xff0c;右键点击某个对象名称&#xff0c;会弹出一个包含操作对象命令的菜单&#xff0c;我们这…

设置文本区域大小_数据验证基本设置技巧

数据验证可以规范用户的文本及数字输入格式&#xff0c;如只能输入指定区间的数值、只能输入文本数据、限制输入空格、限制输入重复值等。设置了数据验证条件后&#xff0c;对符合条件的数据允许输入&#xff0c;对不符合条件的数据则禁止输入。因此&#xff0c;利用此设置可以…

丁丁的生日

7月1日是丁丁的生日&#xff0c;本来计划得很好&#xff0c;下午去给他照相&#xff0c;晚上请一家人吃个饭&#xff0c;然后再去看《变形金刚2》&#xff08;当然这个没有丁丁的份&#xff09;。 谁知道计划真的赶不上变化&#xff0c;本来好好的丁丁上午突然有些低热-37.8&am…

mysql5.7修改root密码_七小服公开课EMC isilon修改丢失的root密码

1、连接串口&#xff0c;并重启2、在终端上&#xff0c;当引导过程中看到如下提示符时&#xff0c;按下空格键:Hit [Enter] to boot immediately, or any other key for command prompt.3、在OK提示符下&#xff0c;运行以下命令:boot -s4、看到 "Enter full pathname of …

textbox matlab,matlab gui 编程文本框更新

本帖最后由 350954832 于 2014-12-6 07:38 编辑我也是个新学matlab的菜鸟&#xff0c;有些东西也是不是特别的明白&#xff0c;这个程序本来是一个界面 我想通过点击运行按钮&#xff0c;在左边的文本框里面显示te1这个数组&#xff0c;但是点击运行这个按钮以后文本框没有更新…

张向东:就以当年期望别人对我们那样的方式

这几天&#xff0c;在北京广州办公室的电梯里&#xff0c;不断遇到来报道的新同事&#xff0c;又开心又担心。开心当然是新同事加入&#xff0c;担心是因为很多方面&#xff0c;我们还在学习中&#xff0c;团队文化、职业化程度都还不够&#xff0c;特别对刚刚毕业的大学生来说…

python怎么看内置模块_Python的内置模块详解

一、什么是模块模块就是封装了一些列功能的py文件&#xff0c;我们使用的时候直接导入这个文件&#xff0c;通过传入参数的方式使用其他文件的功能函数二、模块有哪些内置模块自定义模块第三方模块三、如何导入模块导入模块分为4种&#xff1a;1 #导入模块2 importmode_test3 #…

matlab人工神经网络代码,咨询BP人工神经网络MATLAB实例代码

我想用BP人工神经网络做个预测&#xff0c;已知2000-2012的值&#xff0c;预测2013-2020年的&#xff0c;数据如下&#xff1a;0.410.430.440.450.500.510.550.610.650.610.670.750.72用前三年的预测第四年的&#xff0c;写了MATLAB代码&#xff0c;但效果不好&#xff0c;所以…

[转]SQL语句资料

--语 句 功 能--数据操作SELECT --从数据库表中检索数据行和列INSERT --向数据库表添加新数据行DELETE --从数据库表中删除数据行UPDATE --更新数据库表中的数据--数据定义CREATE TABLE --创建一个数据库表DROP TABLE --从数据库中删除表ALTER TABLE --修改数据库表结构CREATE …

python函数 global_Python global全局变量函数详解

global语句的作用在编写程序的时候&#xff0c;如果想为一个在函数外的变量重新赋值&#xff0c;并且这个变量会作用于许多函数中时&#xff0c;就需要告诉python这个变量的作用域是全局变量。此时用global语句就可以变成这个任务&#xff0c;也就是说没有用global语句的情况下…

服务器php只显示文本,服务器上的php echos文件是文本而不是二进制文件

我编写了一个PHP页面,它读取一个文件,并在添加了一些头文件后对其进行回显:header(Content-disposition: filename" . $fname . ");header(Pragma: no-cache);header(Expires: 0);header(Cache-Control: must-revalidate, post-check0, pre-check0);header(Pragma: p…

vc 6.0 显示文件全路径_配送路径规划思考(十二)

前面十一集的链接配送路径规划思考(十一)配送路径规划思考(十)配送路径规划思考(九)配送路径规划思考(八)配送路径规划思考(七)配送路径规划思考(六)配送路径规划思考(五)配送路径规划思考(四)配送路径规划思考(三)配送路径规划思考(二)配送最短路径思考(一)思考(十一)分享了政…

怎么暂时关闭网站php,WordPress怎么临时关闭网站进行维护

有时可能会因为各种原因导致我们的网站出现访问错误&#xff0c;此时我们就需要临时关闭站点进行维护&#xff0c;那么我们该如何临时关闭站点进行维护呢&#xff1f;下面让我们来看一下如何临时关闭我们的站点吧。1、.maintenance法在WordPress根目录下新建一个名为.maintenan…

DataList控件分页

实现了对DataList的分页 HTML控件的值需要转换web应用程序就可以取到了 1 /**//// <summary> 2 /// 当前页数 3 /// </summary> 4 int CurrentPage; 5 /**//// <summary> 6 /// 每页条数 7 /// </summa…

现代php 阅读笔记,PHP 手册阅读笔记 - 语言参考篇

最近计划把 PHP手册&#xff0c;认真的先过一遍。记录一些以前不知道&#xff0c;不明确的知识。语言参考 > 类型【新认知】强制转换类型用 settype( mixed $var, string $type )。判断变量的类型用is_type函数。例如&#xff1a;if (is_int($an_int)) {$an_int 4;}if (is_…