VC++常用数据类型及其操作详解(未完待续)

 
目录
一.               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 * 与其他数据类型的转换和操作
(1) CString,string,char* 的综合比较(这部分 CSDN 上的作者 joise 的文章
<< CString,string,char* 的综合比较 >> 写的很详细 , 请大家在仔细阅读他的文章 .
或参考附录:
(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 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;
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值