目录
一.
VC常用数据类型列表
二.
常用数据类型转化
2.1数学类型变量与字符串相互转换
2.2CString及string,char *与其他数据类型的转换和操作
●
CString,string,char*
的综合比较
●数学类型与CString相互转化
●CString与char*相互转换举例
●CString 与 BSTR 型转换
●VARIANT 型转化成 CString 型
2.3 BSTR、_bstr_t与CComBSTR
2.4 VARIANT 、_variant_t 与 COleVariant
附录CString及字符串转及操作详解
参考书籍:CSDN,<<MFC深入浅出(Second Edit)>>
一.
VC
常用数据类型列表
|
Type
|
Default Size
|
Description
|
基
础
类
型
全
是
小
写
|
说明
:
这些基础数据类型对于
MFC
还是
API
都是被支持的
| ||
boolean
|
unsigned 8 bit ,
|
取值
TRUE/FALSE
| |
byte
|
unsigned 8 bit,
|
整数
,
输出按字符输出
| |
char
|
unsigned 8 bit,
|
字符
| |
double
|
signed 64 bit
|
浮点型
| |
float
|
signed32 bit
|
浮点型
| |
handle_t
|
|
Primitive handle type
| |
hyper
|
signed 64 bit
|
整型
| |
int
|
signed 32 bit
|
整型
| |
long
|
signed 32 bit
|
整型
| |
short
|
signed 16 bit
|
整型
| |
small
|
signed 8 bit
|
整型
| |
void *
|
32-bit
|
指向未知类型的指针
| |
wchar_t
|
unsigned 16 bit
|
16
位字符
,
比
char
可容纳更多的字符
| |
|
|
| |
Win32
API
常
用
数
据
类
型
全
大
写
|
说明
:
这些
Win32API
支持的简单数据类型主要是用来定义函数返回值,消息参数,结构成员。这类数据类型大致可以分为五大类:字符型、布尔型、整型、指针型和句柄型(
?
)
.
总共大概有
100
多种不同的类型,
| ||
BOOL/BOOLEAN
|
8bit,TRUE/FALSE
|
布尔型
| |
BYTE
|
unsigned 8 bit
|
| |
BSTR
CComBSTR
_bstr_t
|
32 bit
|
BSTR
是指向字符串的
32
位指针
是对
BSTR
的封装
是对
BSTR
的封装
| |
CHAR
|
8 bit
|
(ANSI
)字符类型
| |
COLORREF
|
32 bit
|
RGB
颜色值
整型
| |
DWORD
|
unsigned 32 bit
|
整型
| |
FLOAT
|
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
|
32 bit
|
消息参数
| |
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)将数学类型转换为字符串可以用以下一些函数:
举例: _CRTIMP char * __cdecl _itoa(int, char *, int);//这是一个将数字转换为一个字符串类型的函数,最后一个int表示转换的进制
如以下程序:
int iTyep=3;
char *szChar;
itoa(iType,szChar,2);
cout<<szChar;//
输出为
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);
cout<<temp;
类似的函数列表:
_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 *);
还有很多
,
请自行研究
2
.
2
.
CString
及
string,char *
与其他数据类型的转换和操作
<< CString,string,char*
的综合比较
>>
写的很详细
,
请大家在仔细阅读他的文章
.
或参考附录:
(2)转换:
●数学类型与CString相互转化
数学类型转化为CString
可用Format函数,举例:
CString s;
int i = 64;
s.Format("%d", i)
CString转换为数学类型:举例
CString strValue("1.234");
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 char[10];
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 = .....; // whatever
BSTR 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); // don''t 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 */
}
2
.3 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);
2
.4(
引)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;