




已阅读5页,还剩8页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
VC+常用数据类型及其操作详解-西安邮电学院计算机系 徐兆元(FL FL)2004/08/03目录一 VC常用数据类型列表二 常用数据类型转化2.1数学类型变量与字符串相互转换2.2 CString及string,char *与其他数据类型的转换和操作CString,string,char*的综合比较数学类型与CString相互转化CString与char*相互转换举例CString 与 BSTR 型转换VARIANT 型转化成 CString 型2.3 BSTR、_bstr_t与CComBSTR2.4 VARIANT 、_variant_t 与 COleVariant附录CString及字符串转及操作详解参考书籍:CSDN, 一VC常用数据类型列表TypeDefault SizeDescription基础类型全是小写说明:这些基础数据类型对于MFC还是API都是被支持的booleanunsigned 8 bit ,取值TRUE/FALSEbyteunsigned 8 bit,整数,输出按字符输出charunsigned 8 bit,字符doublesigned 64 bit浮点型floatsigned32 bit浮点型handle_tPrimitive handle typehypersigned 64 bit整型intsigned 32 bit整型longsigned 32 bit整型shortsigned 16 bit整型smallsigned 8 bit整型void *32-bit指向未知类型的指针wchar_tunsigned 16 bit16位字符,比char可容纳更多的字符Win32API常用数据类 型全大写说明: 这些Win32API支持的简单数据类型主要是用来定义函数返回值,消息参数,结构成员。这类数据类型大致可以分为五大类:字符型、布尔型、整型、指针型和句柄型(?). 总共大概有100多种不同的类型, BOOL/BOOLEAN8bit,TRUE/FALSE布尔型BYTEunsigned 8 bitBSTRCComBSTR_bstr_t32 bitBSTR是指向字符串的32位指针是对BSTR的封装是对BSTR的封装CHAR8 bit(ANSI)字符类型COLORREF32 bitRGB颜色值 整型DWORDunsigned 32 bit整型FLOATfloat型float型HANDLEObject句柄HBITMAPbitmap句柄HBRUSHbrush句柄HCURSORcursor句柄HDC设备上下文句柄HFILEOpenFile打开的File句柄HFONTfont句柄HHOOKhook句柄HKEY注册表键句柄HPENpen句柄HWNDwindow句柄INT-LONG-LONGLONG64位带符号整型LPARAM32 bit 消息参数LPBOOLBOOL型指针LPBYTEBYTE型指针LPCOLOREFCOLORREF型指针LPCSTR/LPSTR/PCSTR指向8位(ANSI)字符串类型指针LPCWSTR/LPWSTR/PCWSTR指向16位Unicode字符串类型LPCTSTR/LPTSTR/PCTSTR指向一8位或16位字符串类型指针LPVOID指向一个未指定类型的32位指针LPDWORD指向一个DWORD型指针其他相似类型: LPHANDLE、LPINT、LPLONG、LPWORD、LPRESULTPBOOL、PBOOLEAN、PBYTE、PCHAR、PDWORD、PFLOAT、PHANDLE、PINT、PLONG、PSHORT说明:(1)在16位系统中 LP为16bit,P为8bit,在32位系统中都是32bit(此时等价)(2)LPCSTR等 中的C指Const,T表示TCHAR模式即可以工作在ANSI下也可UNICODESHORTusigned整型其他UCHAR、UINT、ULONG、ULONGLONG、USHORT为无符号相应类型TBYTEWCHAR型或者CHAR型TCHARANSI与unicode均可VARIANT_variant_tCOleVariant一个结构体参考OAIDL.H_variant_t是VARIANT的封装类COleVariant也是VARIANT的封装类WNDPROC指向一个窗口过程的32位指针WCHAR16位Unicode字符型WORD16位无符号整型WPARAM消息参数MFC独有数据类型下面两个数据类型是微软基础类库中独有的数据类型POSITION标记集合中一个元素的位置的值,被MFC中的集合类所使用LPCRECT指向一个RECT结构体常量(不能修改)的32位指针CString 其实是MFC中的一个类说明:(1)-表示省略(2)1Byte=8Bit,字与机器有关,在8位系统中:字=1字节,16位系统中,1字=2字节,32位中:1字=4字节,64位中1字=8字节.不要搞混这些概念.二常用数据类型转化及操作21 数学类型变量与字符串相互转换(这些函数都在STDLIB.H里)(1)将数学类型转换为字符串可以用以下一些函数:举例: _CRTIMP char * _cdecl _itoa(int, char *, int);/这是一个将数字转换为一个字符串类型的函数,最后一个int表示转换的进制如以下程序:int iTyep=3;char *szChar;itoa(iType,szChar,2);coutszChar;/输出为1010类似函数列表:_CRTIMP char * _cdecl _itoa(int, char *, int);/为了完整性,也列在其中_CRTIMP char * _cdecl _ultoa(unsigned long, char *, int);_CRTIMP char * _cdecl _ltoa(long, char *, int);_CRTIMP char * _cdecl _i64toa(_int64, char *, int);_CRTIMP char * _cdecl _ui64toa(unsigned _int64, char *, int);_CRTIMP wchar_t * _cdecl _i64tow(_int64, wchar_t *, int);_CRTIMP wchar_t * _cdecl _ui64tow(unsigned _int64, wchar_t *, int);_CRTIMP wchar_t * _cdecl _itow (int, wchar_t *, int);/转换为长字符串类型_CRTIMP wchar_t * _cdecl _ltow (long, wchar_t *, int);_CRTIMP wchar_t * _cdecl _ultow (unsigned long, wchar_t *, int);还有很多,请自行研究(2)将字符串类型转换为数学类型变量可以用以下一些函数:举例: _CRTIMP int _cdecl atoi(const char *);/参数一看就很明了char *szChar=”88”;int temp(0);temp=atoi(szChar);couttemp;类似的函数列表:_CRTIMP int _cdecl atoi(const char *);_CRTIMP double _cdecl atof(const char *);_CRTIMP long _cdecl atol(const char *);_CRTIMP long double _cdecl _atold(const char *);_CRTIMP _int64 _cdecl _atoi64(const char *);_CRTIMP double _cdecl strtod(const char *, char *);/_CRTIMP long _cdecl strtol(const char *, char *, int);/_CRTIMP long double _cdecl _strtold(const char *, char *);_CRTIMP unsigned long _cdecl strtoul(const char *, char *, int);_CRTIMP double _cdecl wcstod(const wchar_t *, wchar_t *);/长字符串类型转换为数学类型_CRTIMP long _cdecl wcstol(const wchar_t *, wchar_t *, int);_CRTIMP unsigned long _cdecl wcstoul(const wchar_t *, wchar_t *, int);_CRTIMP int _cdecl _wtoi(const wchar_t *);_CRTIMP long _cdecl _wtol(const wchar_t *);_CRTIMP _int64 _cdecl _wtoi64(const wchar_t *);还有很多,请自行研究22CString及string,char *与其他数据类型的转换和操作(1)CString,string,char*的综合比较(这部分CSDN上的作者joise的文章写的很详细,请大家在仔细阅读他的文章.地址: /joise/或参考附录:(2)转换:数学类型与CString相互转化 数学类型转化为CString 可用Format函数,举例:CString s; int i = 64; s.Format(%d, i) CString转换为数学类型:举例CString strValue(1.234);double dblValue;dblValue = atof(LPCTSTR)strValue);CString与char*相互转换举例CString strValue(“Hello”);char *szValue;szValue=strValue.GetBuffer(szValue);也可用(LPSTR)(LPCTSTR)对CString/进行强制转换.szValue=(LPSTR)(LPCTSTR)strValue;反过来可直接赋值:char *szChar=NULL;CString strValue;szChar=new char10;memset(szChar,0,10);strcpy(szChar,”Hello”);strValue=szChar;CString 与 BSTR 型转换CString 型转化成 BSTR 型当我们使用 ActiveX 控件编程时,经常需要用到将某个值表示成 BSTR 类型.BSTR 是一种记数字符串,Intel平台上的宽字符串(Unicode),并且可以包含嵌入的 NULL 字符。可以调用 CString 对象的 AllocSysString 方法将 CString 转化成 BSTR:CString str;str = .; / whateverBSTR bStr = str.AllocSysString();BSTR型转换为CString如果你在 UNICODE 模式下编译代码,你可以简单地写成:CString convert(BSTR bStr) if(bStr = NULL) return CString(_T(); CString s(bStr); / in UNICODE mode return s;如果是 ANSI 模式CString convert(BSTR b) CString s; if(b = NULL) return s; / empty for NULL BSTR#ifdef UNICODE s = b;#else LPSTR p = s.GetBuffer(SysStringLen(b) + 1); :WideCharToMultiByte(CP_ACP, / ANSI Code Page 0, / no flags b, / source widechar string -1, / assume NUL-terminated p, / target buffer SysStringLen(b)+1, / target buffer length NULL, / use system default char NULL); / dont care if default used s.ReleaseBuffer();#endif return s;VARIANT 型转化成 CString 型VARIANT 类型经常用来给 COM 对象传递参数,或者接收从 COM 对象返回的值。你也能自己编写返回 VARIANT 类型的方法,函数返回什么类型 依赖可能(并且常常)方法的输入参数(比如,在自动化操作中,依赖与你调用哪个方法。IDispatch:Invoke 可能返回(通过其一个参数)一个 包含有BYTE、WORD、float、double、date、BSTR 等等 VARIANT 类型的结果,(详见 MSDN 上的 VARIANT 结构的定义)。在下面的例子中,假设 类型是一个BSTR的变体,也就是说在串中的值是通过 bsrtVal 来引用,其优点是在 ANSI 应用中,有一个构造函数会把 LPCWCHAR 引用的值转换为一个 CString(见 BSTR-to-CString 部分)。在 Unicode 模式中,将成为标准的 CString 构造函数,参见对缺省:WideCharToMultiByte 转换的告诫,以及你觉得是否可以接受(大多数情况下,你会满意的)。VARIANT vaData;vaData = m_com.YourMethodHere();ASSERT(vaData.vt = VT_BSTR);CString strData(vaData.bstrVal);你还可以根据 vt 域的不同来建立更通用的转换例程。为此你可能会考虑:CString VariantToString(VARIANT * va) CString s; switch(va-vt) /* vt */ case VT_BSTR: return CString(vaData-bstrVal); case VT_BSTR | VT_BYREF: return CString(*vaData-pbstrVal); case VT_I4: s.Format(_T(%d), va-lVal); return s; case VT_I4 | VT_BYREF: s.Format(_T(%d), *va-plVal); case VT_R8: s.Format(_T(%f), va-dblVal); return s; . 剩下的类型转换由读者自己完成 default: ASSERT(FALSE); / unknown VARIANT type (this ASSERT is optional) return CString(); /* vt */23 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);24(引)VARIANT 、_variant_t 与 COleVariant VARIANT的结构可以参考头文件VC98IncludeOAIDL.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;附录CString,string,char*的综合比较(一) 概述string和CString均是字符串模板类,string为标准模板类(STL)定义的字符串类,已经纳入C+标准之中;CString(typedef CStringTTCHAR, StrTraitMFC CString)为Visual C+中最常用的字符串类,继承自CSimpleStringT类,主要应用在MFC和ATL编程中,主要数据类型有char(应用于ANSI),wchar_t(unicode),TCHAR(ANSI与unicode均可);char*为C编程中最常用的字符串指针,一般以0为结束标志;(二) 构造 string是方便的,可以从几乎所有的字符串构造而来,包括CString和char*; CString次之,可以从基本的一些字符串变量构造而来,包括char*等; char*没有构造函数,仅可以赋值; 举例:char* psz = “joise”;CString cstr( psz );string str( cstr );(三) 运算符重载a) operator= string是最方便的,几乎可以直接用所有的字符串赋值,包括CString和char*; CString次之,可以直接用些基本的字符串赋值,包括char*等; char*只能由指针赋值,并且是极危险的操作,建议使用strcpy或者memcpy,而且char*在声明的时候如未赋初值建议先设为NULL,以避免野指针,令你抓狂; 举例:char *psz = NULL;psz = new char10; /当然,以上的直接写成char *psz = new char10;也是一样memset( psz, 0, 10 );strcpy( psz, “joise” ); CString cstr;cstr = psz;string str;str = psz;str = cstr;delete psz;b) operator+ string与CString差不多,可以直接与char*进行加法,但不可以相互使用+运算符,即string str = str + cstr是非法的,须转换成char*; char*没有+运算,只能使用strcat把两个指针连在一起; 举例:char* psz = “joise”;CString cstr = psz;cstr = cstr + psz;string str = psz;str = str + str + psz;strcat( psz, psz );strcat( psz, cstr );/合法strcat( psz, str );/非法,由此可见,CString可自动转换为const char*,而string不行c) operator += string是最强大的,几乎可以与所有的字符串变量+
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 软件测试基础知识试题及答案
- 2025届钦州市重点中学数学七下期末复习检测模拟试题含解析
- 2025届北京东城二中学八年级数学第二学期期末质量检测试题含解析
- C++高级编程技巧试题及答案
- 网络安全攻防演练中的策略与技巧试题及答案
- 如何开展精益管理实践计划
- 医院内部培训体系建设计划
- 重庆市彭水一中学2025届七年级数学第二学期期末教学质量检测模拟试题含解析
- 软件开发常见问题解析试题及答案
- 城市交通与城市规划方法创新研究重点基础知识点
- 金属学原理162张课件
- 2023年四川省第一期医疗护理员理论考试试题及答案
- 2022-2023学年宁夏回族石嘴山市大武口区小学六年级第二学期小升初数学试卷含答案
- 日本文化知识竞赛真题模拟汇编(共877题)
- 幼儿园小班语言活动《我不想离开你》绘本故事PPT课件【幼儿教案】
- 2023汽车智能座舱分级与综合评价白皮书
- 职业暴露针刺伤应急预案演练脚本-
- 校外培训机构章程示范文本
- 大学生就业指导之职业素养与职业能力
- 砂检验报告(机制砂)国标 亚甲蓝值<1.4或合格
- YY/T 0068.2-2008医用内窥镜硬性内窥镜第2部分:机械性能及测试方法
评论
0/150
提交评论