VC++中常用数据类型及操作Word格式文档下载.docx
- 文档编号:22575398
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:20
- 大小:25.86KB
VC++中常用数据类型及操作Word格式文档下载.docx
《VC++中常用数据类型及操作Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《VC++中常用数据类型及操作Word格式文档下载.docx(20页珍藏版)》请在冰豆网上搜索。
浮点型
float
signed32bit
handle_t
Primitivehandletype
hyper
整型
int
signed32bit
long
short
signed16bit
small
signed8bit
void*
32-bit
指向未知类型的指针
wchar_t
unsigned16bit
16位字符,比char可容纳更多的字符
Win32
API
常
用
数
据
大
这些Win32API支持的简单数据类型主要是用来定义函数返回值,消息参数,结构成员。
这类数据类型大致可以分为五大类:
字符型、布尔型、整型、指针型和句柄型(?
).总共大概有100多种不同的类型,
BOOL/BOOLEAN
8bit,TRUE/FALSE
布尔型
BYTE
unsigned8bit
BSTR
CComBSTR
_bstr_t
32bit
BSTR是指向字符串的32位指针
是对BSTR的封装
CHAR
8bit
(ANSI)字符类型
COLORREF
RGB颜色值整型
DWORD
unsigned32bit
FLOAT
float型
HANDLE
Object句柄
HBITMAP
bitmap句柄
HBRUSH
brush句柄
HCURSOR
cursor句柄
HDC
设备上下文句柄
HFILE
OpenFile打开的File句柄
HFONT
font句柄
HHOOK
hook句柄
HKEY
注册表键句柄
HPEN
pen句柄
HWND
window句柄
INT
--------
LONG
---------
LONGLONG
64位带符号整型
LPARAM
消息参数
LPBOOL
BOOL型指针
LPBYTE
BYTE型指针
LPCOLOREF
COLORREF型指针
LPCSTR/LPSTR/PCSTR
指向8位(ANSI)字符串类型指针
LPCWSTR/LPWSTR/PCWSTR
指向16位Unicode字符串类型
LPCTSTR/LPTSTR/PCTSTR
指向一8位或16位字符串类型指针
LPVOID
指向一个未指定类型的32位指针
LPDWORD
指向一个DWORD型指针
其他相似类型:
LPHANDLE、LPINT、LPLONG、LPWORD、LPRESULT
PBOOL、PBOOLEAN、PBYTE、PCHAR、PDWORD、PFLOAT、PHANDLE、PINT、PLONG、PSHORT……
(1)在16位系统中LP为16bit,P为8bit,在32位系统中都是32bit(此时等价)
(2)LPCSTR等中的C指Const,T表示TCHAR模式即可以工作在ANSI下也可UNICODE
SHORT
usigned
其他UCHAR、UINT、ULONG、ULONGLONG、USHORT为无符号相应类型
TBYTE
WCHAR型或者CHAR型
TCHAR
ANSI与unicode均可
VARIANT
_variant_t
COleVariant
一个结构体参考OAIDL.H
_variant_t是VARIANT的封装类
COleVariant也是VARIANT的封装类
WNDPROC
指向一个窗口过程的32位指针
WCHAR
16位Unicode字符型
WORD
16位无符号整型
WPARAM
MFC
独有
数据
类型
下面两个数据类型是微软基础类库中独有的数据类型
POSITION
标记集合中一个元素的位置的值,被MFC中的集合类所使用
LPCRECT
指向一个RECT结构体常量(不能修改)的32位指针
CString
其实是MFC中的一个类
(1)-------表示省略
(2)1Byte=8Bit,
字与机器有关,在8位系统中:
字=1字节,16位系统中,1字=2字节,32位中:
1字=4字节,
64位中1字=8字节.不要搞混这些概念.
二.常用数据类型转化及操作
2.1数学类型变量与字符串相互转换(这些函数都在STDLIB.H里)
(1)将数学类型转换为字符串可以用以下一些函数:
举例:
_CRTIMPchar*__cdecl_itoa(int,char*,int);
//这是一个将数字转换为一个字符串类型的函数,最后一个int表示转换的进制
如以下程序:
intiTyep=3;
char*szChar;
itoa(iType,szChar,2);
cout<
szChar;
//输出为1010
类似函数列表:
_CRTIMPchar*__cdecl_itoa(int,char*,int);
//为了完整性,也列在其中
_CRTIMPchar*__cdecl_ultoa(unsignedlong,char*,int);
_CRTIMPchar*__cdecl_ltoa(long,char*,int);
_CRTIMPchar*__cdecl_i64toa(__int64,char*,int);
_CRTIMPchar*__cdecl_ui64toa(unsigned__int64,char*,int);
_CRTIMPwchar_t*__cdecl_i64tow(__int64,wchar_t*,int);
_CRTIMPwchar_t*__cdecl_ui64tow(unsigned__int64,wchar_t*,int);
_CRTIMPwchar_t*__cdecl_itow(int,wchar_t*,int);
//转换为长字符串类型
_CRTIMPwchar_t*__cdecl_ltow(long,wchar_t*,int);
_CRTIMPwchar_t*__cdecl_ultow(unsignedlong,wchar_t*,int);
还有很多,请自行研究
(2)将字符串类型转换为数学类型变量可以用以下一些函数:
_CRTIMPint
__cdeclatoi(constchar*);
//参数一看就很明了
char*szChar=”88”;
inttemp(0);
temp=atoi(szChar);
temp;
类似的函数列表:
_CRTIMPint
_CRTIMPdouble__cdeclatof(constchar*);
_CRTIMPlong
__cdeclatol(constchar*);
_CRTIMPlongdouble__cdecl_atold(constchar*);
_CRTIMP__int64__cdecl_atoi64(constchar*);
_CRTIMPdouble__cdeclstrtod(constchar*,char**);
//
__cdeclstrtol(constchar*,char**,int);
_CRTIMPlongdouble__cdecl_strtold(constchar*,char**);
_CRTIMPunsignedlong__cdeclstrtoul(constchar*,char**,int);
_CRTIMPdouble__cdeclwcstod(constwchar_t*,wchar_t**);
//长字符串类型转换为数学类型
__cdeclwcstol(constwchar_t*,wchar_t**,int);
_CRTIMPunsignedlong__cdeclwcstoul(constwchar_t*,wchar_t**,int);
_CRTIMPint__cdecl_wtoi(constwchar_t*);
_CRTIMPlong__cdecl_wtol(constwchar_t*);
_CRTIMP__int64
__cdecl_wtoi64(constwchar_t*);
2.2.CString及string,char*与其他数据类型的转换和操作
(1)CString,string,char*的综合比较(这部分CSDN上的作者joise的文章
CString,string,char*的综合比较>
写的很详细,请大家在仔细阅读他的文章.
地址:
或参考附录:
(2)转换:
数学类型转化为CString
可用Format函数,举例:
CStrings;
inti=64;
s.Format("
%d"
i)
CString转换为数学类型:
举例CStringstrValue("
1.234"
);
doubledblValue;
dblValue=atof((LPCTSTR)strValue);
CStringstrValue(“Hello”);
char*szValue;
szValue=strValue.GetBuffer(szValue);
也可用(LPSTR)(LPCTSTR)对CString//
进行强制转换.
szValue=(LPSTR)(LPCTSTR)strValue;
反过来可直接赋值:
char*szChar=NULL;
CStringstrValue;
szChar=newchar[10];
memset(szChar,0,10);
strcpy(szChar,”Hello”);
strValue=szChar;
CString型转化成BSTR型
当我们使用ActiveX控件编程时,经常需要用到将某个值表示成BSTR类型.BSTR是一种记数字符串,Intel平台上的宽字符串(Unicode),并且可以包含嵌入的NULL字符。
可以调用CString对象的AllocSysString方法将CString转化成BSTR:
CStringstr;
str=.....;
//whatever
BSTRbStr=str.AllocSysString();
BSTR型转换为CString
如果你在UNICODE模式下编译代码,你可以简单地写成:
CStringconvert(BSTRbStr)
{
if(bStr==NULL)
returnCString(_T("
"
));
CStrings(bStr);
//inUNICODEmode
returns;
}
如果是ANSI模式
CStringconvert(BSTRb)
CStrings;
if(b==NULL)
//emptyforNULLBSTR
#ifdefUNICODE
s=b;
#else
LPSTRp=s.GetBuffer(SysStringLen(b)+1);
:
:
WideCharToMultiByte(CP_ACP,
//ANSICodePage
0,
//noflags
b,
//sourcewidecharstring
-1,
//assumeNUL-terminated
p,
//targetbuffer
SysStringLen(b)+1,//targetbufferlength
NULL,
//usesystemdefaultchar
NULL);
//don'
'
tcareifdefaultused
s.ReleaseBuffer();
#endif
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转换的告诫,以及你觉得是否可以接受(大多数情况下,你会满意的)。
VARIANTvaData;
vaData=m_com.YourMethodHere();
ASSERT(vaData.vt==VT_BSTR);
CStringstrData(vaData.bstrVal);
你还可以根据vt域的不同来建立更通用的转换例程。
为此你可能会考虑:
CStringVariantToString(VARIANT*va)
switch(va->
vt)
{/*vt*/
caseVT_BSTR:
returnCString(vaData->
bstrVal);
caseVT_BSTR|VT_BYREF:
returnCString(*vaData->
pbstrVal);
caseVT_I4:
s.Format(_T("
),va->
lVal);
caseVT_I4|VT_BYREF:
),*va->
plVal);
caseVT_R8:
%f"
dblVal);
...剩下的类型转换由读者自己完成
default:
ASSERT(FALSE);
//unknownVARIANTtype(thisASSERTisoptional)
returnCString("
}/*vt*/
2.3BSTR、_bstr_t与CComBSTR
CComBSTR、_bstr_t是对BSTR的封装,BSTR是指向字符串的32位指针。
char*转换到BSTR可以这样:
BSTRb=_com_util:
ConvertStringToBSTR("
数据"
///使用前需要加上头文件comutil.h
反之可以使用char*p=_com_util:
ConvertBSTRToString(b);
2.4(引)VARIANT、_variant_t与COleVariant
VARIANT的结构可以参考头文件VC98\Include\OAIDL.H中关于结构体tagVARIANT的定义。
对于VARIANT变量的赋值:
首先给vt成员赋值,指明数据类型,再对联合结构中相同数据类型的变量赋值,举个例子:
VARIANTva;
inta=2001;
va.vt=VT_I4;
///指明整型数据
va.lVal=a;
///赋值
对于不马上赋值的VARIANT,最好先用VoidVariantInit(VARIANTARGFAR*pvarg);
进行初始化,其本质是将vt设置为VT_EMPTY,下表我们列举vt与常用数据的对应关系:
unsignedcharbVal;
VT_UI1
shortiVal;
VT_I2
longlVal;
VT_I4
floatfltVal;
VT_R4
doubledblVal;
VT_R8
VARIANT_BOOLboolVal;
VT_BOOL
SCODEscode;
VT_ERROR
CYcyVal;
VT_CY
DATEdate;
VT_DATE
BSTRbstrVal;
VT_BSTR
IUnknownFAR*punkVal;
VT_UNKNOWN
IDispatchFAR*pdispVal;
VT_DISPATCH
SAFEARRAYFAR*parray;
VT_ARRAY|*
unsignedcharFAR*pbVal;
VT_BYREF|VT_UI1
shortFAR*piVal;
VT_BYREF|VT_I2
longFAR*plVal;
VT_BYREF|VT_I4
floatFAR*pfltVal;
VT_BYREF|VT_R4
doubleFAR*pdblVal;
VT_BYREF|VT_R8
VARIANT_BOOLFAR*pboolVal;
VT_BYREF|VT_BOOL
SCODEFAR*pscode;
VT_BYREF|VT_ERROR
CYFAR*pcyVal;
VT_BYREF|VT_CY
DATEFAR*pdate;
VT_BYREF|VT_DATE
BSTRFAR*pbstrVal;
VT_BYREF|VT_BSTR
IUnknownFAR*FAR*ppunkVal;
VT_BYREF|VT_UNKNOWN
IDispatchFAR*FAR*ppdispVal;
VT_BYREF|VT_DISPATCH
SAFEARRAYFAR*FAR*pparray;
VARIANTFAR*pvarVal;
VT_BYREF|VT_VARIANT
voidFAR*byref;
VT_BYREF
_variant_t是VARIANT的封装类,其赋值可以使用强制类型转换,其构造函数会自动处理这些数据类型。
例如:
longl=222;
ingi=100;
_variant_tlVal(l);
lVal=(long)i;
COleVariant的使用与_variant_t的方法基本一样,请参考如下例子:
COleVariantv3="
字符串"
v4=(long)1999;
CStringstr=(BSTR)v3.pbstrVal;
longi=v4.lVal;
VC++.NET中字符串之间的转换
一、BSTR、LPSTR和LPWSTR
在VisualC++.NET的所有编程方式中,我们常常要用到这样的一些基本字符串类型,如BSTR、LPSTR和LPWSTR等。
之所以出现类似上述的这些数据类型,是因为不同编程语言之间的数据交换以及对ANSI、Unicode和多字节字符集(MBCS)的支持。
那么什么是BSTR、LPSTR以及LPWSTR呢?
BSTR(BasicSTRing,Basic字符串)是一个OLECHAR*类型的Unicode字符串。
它被描述成一个与自动化相兼容的类型。
由于操作系统提供相应的API函数(如SysAllocString)来管理它以及一些默认的调度代码,因此BSTR实际上就是一个COM字符串,但它却在自动化技术以外的多种场合下得到广泛使用。
图1描述了BSTR的结构,其中DWORD值是字符串中实际所占用的字节数,且它的值是字符串中Unicode字符的两倍。
LPSTR和LP
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VC 常用 数据类型 操作