vc++数据类型转换大全Word文档下载推荐.docx
《vc++数据类型转换大全Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《vc++数据类型转换大全Word文档下载推荐.docx(14页珍藏版)》请在冰豆网上搜索。
:
SysAllocString(L”程序员”);
char*buf=_com_util:
ConvertBSTRToString(bstrValue);
SysFreeString(bstrValue);
AfxMessageBox(buf);
delete(buf);
CComBSTR变量
CComBSTRbstrVar(”test”);
char*buf=_com_util:
ConvertBSTRToString(bstrVar.m_str);
_bstr_t变量
_bstr_t类型是对BSTR的封装,因为已经重载了=操作符,所以很容易使用
_bstr_tbstrVar(”test”);
constchar*buf=bstrVar;
///不要修改buf中的内容
通用方法(针对非COM数据类型)
用sprintf完成转换
charbuffer[200];
charc=‘1′;
inti=35;
longj=1000;
floatf=1.7320534f;
sprintf(buffer,“%c”,c);
sprintf(buffer,“%d”,i);
sprintf(buffer,“%d”,j);
sprintf(buffer,“%f”,f);
二、字符串转换为其它数据类型
strcpy(temp,”123″);
i=atoi(temp);
l=atol(temp);
浮点(double)
d=atof(temp);
CStringname=temp;
…///完成对bstrValue的使用
CComBSTR类型变量可以直接赋值
CComBSTRbstrVar1(”test”);
CComBSTRbstrVar2(temp);
_bstr_t类型的变量可以直接赋值
_bstr_tbstrVar1(”test”);
_bstr_tbstrVar2(temp);
三、其它数据类型转换到CString
使用CString的成员函数Format来转换,例如:
整数(int)
str.Format(”%d”,i);
浮点数(float)
str.Format(”%f”,i);
字符串指针(char
*)等已经被CString构造函数支持的数据类型可以直接赋值
str=username;
对于Format所不支持的数据类型,可以通过上面所说的关于其它数据类型转化到char
*的方法先转到char*,然后赋值给CString变量。
四、BSTR、_bstr_t与CComBSTR
CComBSTR
是ATL对BSTR的封装,_bstr_t是C++对BSTR的封装,BSTR是32位指针,但并不直接指向字串的缓冲区。
char*转换到BSTR可以这样:
BSTR
b=_com_util:
ConvertStringToBSTR(”数据”);
///使用前需要加上comutil.h和comsupp.lib
反之可以使用
char*p=_com_util:
ConvertBSTRToString(b);
deletep;
具体可以参考一,二段落里的具体说明。
CComBSTR与_bstr_t对大量的操作符进行了重载,可以直接进行=,!
=,==等操作,所以使用非常方便。
特别是_bstr_t,建议大家使用它。
五、VARIANT、_variant_t与COleVariant
VARIANT的结构可以参考头文件VC98\Include\OAIDL.H中关于结构体tagVARIANT的定义。
对于VARIANT变量的赋值:
首先给vt成员赋值,指明数据类型,再对联合结构中相同数据类型的变量赋值,举个例子:
VARIANTva;
inta=2001;
va.vt=VT_I4;
///指明整型数据
va.lVal=a;
///赋值
对于不马上赋值的VARIANT,最好先用Void
VariantInit(VARIANTARGFAR*
pvarg);
进行初始化,其本质是将vt设置为VT_EMPTY,下表我们列举vt与常用数据的对应关系:
BytebVal;
//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.
DECIMALFAR*pdecVal//VT_BYREF|VT_DECIMAL.
IUnknownFAR*punkVal;
//VT_UNKNOWN.
IDispatchFAR*pdispVal;
//VT_DISPATCH.
SAFEARRAYFAR*parray;
//VT_ARRAY|*.
ByteFAR*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;
//GenericByRef.
charcVal;
//VT_I1.
unsignedshortuiVal;
//VT_UI2.
unsignedlongulVal;
//VT_UI4.
intintVal;
//VT_INT.
unsignedintuintVal;
//VT_UINT.
charFAR*pcVal;
//VT_BYREF|VT_I1.
unsignedshortFAR*puiVal;
//VT_BYREF|VT_UI2.
unsignedlongFAR*pulVal;
//VT_BYREF|VT_UI4.
intFAR*pintVal;
//VT_BYREF|VT_INT.
unsignedintFAR*puintVal;
//VT_BYREF|VT_UINT.
_variant_t是VARIANT的封装类,其赋值可以使用强制类型转换,其构造函数会自动处理这些数据类型。
使用时需加上#include
例如:
longl=222;
ingi=100;
_variant_tlVal(l);
lVal=(long)i;
COleVariant的使用与_variant_t的方法基本一样,请参考如下例子:
COleVariantv3=“字符串”,v4=(long)1999;
CStringstr=(BSTR)v3.pbstrVal;
longi=v4.lVal;
六、其它一些COM数据类型
根据ProgID得到CLSID
HRESULTCLSIDFromProgID(LPCOLESTRlpszProgID,LPCLSIDpclsid);
CLSIDclsid;
CLSIDFromProgID(L”MAPI.Folder”,&
clsid);
根据CLSID得到ProgID
WINOLEAPIProgIDFromCLSID(REFCLSIDclsid,LPOLESTR*lplpszProgID);
例如我们已经定义了
CLSID_IApplication,下面的代码得到ProgID
LPOLESTRpProgID=0;
ProgIDFromCLSID(CLSID_IApplication,&
pProgID);
…///可以使用pProgID
CoTaskMemFree(pProgID);
//不要忘记释放
七、ANSI与Unicode
Unicode称为宽字符型字串,COM里使用的都是Unicode字符串。
将ANSI转换到Unicode
(1)通过L这个宏来实现,例如:
CLSIDFromProgID(
L”MAPI.Folder”,&
(2)通过MultiByteToWideChar函数实现转换,例如:
char*szProgID=“MAPI.Folder”;
WCHARszWideProgID[128];
longlLen=
MultiByteToWideChar(CP_ACP,0,szProgID,strlen(szProgID),szWideProgID,sizeof(szWideProgID));
szWideProgID[lLen]=‘\0′;
(3)通过A2W宏来实现,例如:
USES_CONVERSION;
CLSIDFromProgID(A2W(szProgID),&
将Unicode转换到ANSI
(1)使用WideCharToMultiByte,例如:
//假设已经有了一个Unicode串wszSomeString…
charszANSIString[MAX_PATH];
WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,wszSomeString,-1,
szANSIString,sizeof(szANSIString),NULL,NULL);
(2)使用W2A宏来实现,例如:
pTemp=W2A(wszSomeString);
八、其它
对消息的处理中我们经常需要将WPARAM或LPARAM等32位数据(DWORD)分解成两个16位数据(WORD),例如:
LPARAMlParam;
WORDloValue=LOWORD(lParam);
///取低16位
WORDhiValue=HIWORD(lParam);
///取高16位
对于16位的数据(WORD)我们可以用同样的方法分解成高低两个8位数据(BYTE),例如:
WORDwValue;
BYTEloValue=LOBYTE(wValue);
///取低8位
BYTEhiValue=HIBYTE(wValue);
///取高8位
两个16位数据(WORD)合成32位数据(DWORD,LRESULT,LPARAM,或WPARAM)
LONGMAKELONG(WORDwLow,WORDwHigh);
WPARAMMAKEWPARAM(WORDwLow,WORDwHigh);
LPARAMMAKELPARAM(WORDwLow,WORDwHigh);
LRESULTMAKELRESULT(WORDwLow,WORDwHigh);
两个8位的数据(BYTE)合成16位的数据(WORD)
WORDMAKEWORD(BYTEbLow,BYTEbHigh);
从R(red),G(green),B(blue)三色得到COLORREF类型的颜色值
COLORREFRGB(BYTEbyRed,BYTEbyGreen,BYTEbyBlue);
例如COLORREFbkcolor=RGB(0×
22,0×
98,0×
34);
从COLORREF类型的颜色值得到RGB三个颜色值
BYTERed=GetRValue(bkcolor);
///得到红颜色
BYTEGreen=GetGValue(bkcolor);
///得到绿颜色
BYTEBlue=GetBValue(bkcolor);
///得到兰颜色
九、注意事项
假如需要使用到ConvertBSTRToString此类函数,需要加上头文件comutil.h,并在setting中加入comsupp.lib或者直接加上#pragma
comment(lib,“comsupp.lib”)
后记:
本文匆匆写成,错误之处在所难免,欢迎指正.
关于把BSTR类型数据转换成CString类型数据时的问题?
当我在把BSTR类型数据转换成CString或“char*
类型”数据时,发现在BSTR类型字符串较短的情况下没问题,当较长时就会出现
内存读写错了。
(在NT,2000下都测试是这样的。
)
根据你所说:
1)字符串指针(char
*)等已经被CString构造函数支持的数据类型
可以直接赋值str=username;
2)当b为BSTR类型时可以使用
于是以下是对的:
CStringcstr;
BSTRbstr;
….
cstr=com_util:
ConvertBSTRToString(bstr);
…
可是当bstr非常大时(其实,较大时就会)就会出现内存读写错,不知何故。
此外我发现cstr=com_util:
可以简化为cstr=bstr;
但当bstr较大时同样出现这个问题。
请兄弟帮忙!
急。
谢谢!
如何转化((list*)fileip.bian)->
liang
关于把CString转化成LPCTSTR的问题作者:
jakiesun
发表日期:
2001-9-520:
08:
48
我记的我以前写过这样一段代码
voidfunction()
{
CStringstr,str1,str2;
function((char*)(LPCTSTR)str1);
str=str1;
…//调试道此发现str2的值随着str的改变而改变,请问能解释一下为什么,如有回答,请通知
wangshaoh...@,tx先
}
添加lib支持作者:
磨刀霍霍发表日期:
2001-9-1011:
32:
12
如果不添加会产生错误,在setting中加入comsupp.lib或者直接#pragma
微软认为缺省的设置call
convention如果不设置成__cdecl也会出现同样的错误。
1。
int转成cstring?
?
回复人:
caigzhi(caigzhi) (2001-10-1711:
27:
35)得0分
CString的成员函数Format()
inta=2131;
str.Format(”%d”,a);
tenchi(C与C++之间) (2001-10-1711:
12)得0分
inti=2001;
charstr[10];
_itoa(i,str,10);
CStringszString=str;
fiolin(幽深的水) (2001-10-1711:
45:
40)得0分
他们两个的都可以!
!
sohucsdnvc(thanks) (2001-10-1713:
24:
17)得0分
那如何把double转成cstring
yihugang(小虎子) (2001-10-1713:
29:
15)得6分
inti=2131;
char*c=newchar[20];
sprintf(c,’%d’,i);
str=*c;
Gu_c_h(Gu) (2001-10-1714:
07:
用_gcvt下面是msdn的例子
Example
/*_GCVT.C:
Thisprogramconverts-3.1415e5
*toitsstringrepresentation.
*/
#include
voidmain(void)
charbuffer[50];
doublesource=-3.1415e5;
_gcvt(source,7,buffer);
printf(“source:
%fbuffer:
‘%s’\n”,source,buffer);
%ebuffer:
Output
-314150.000000buffer:
‘-314150.’
-3.141500e+005buffer:
49:
56)得6分
inta=-3.1415e5;
str.Format(”%f”,a);
ruixp(锐剑) (2001-10-1715:
06:
48)得6分
2。
基类对象怎么能转换成派生类对象?
intCDaoListView:
OnCreate(LPCREATESTRUCTlpCreateStruct)
lpCreateStruct->
style|=LVS_REPORT|LVS_EDITLABELS;
if(CListView:
OnCreate(lpCreateStruct)==-1)
return-1;
////////////创建ImageList;
CDaoViewApp*pApp=(CDaoViewApp*)AfxGetApp();
m_pImageList=newCImageList();
ASSERT(m_pImageList!
=NULL);
m_pImageList->
Create(16,16,TRUE,4,4);
Add(pApp->
LoadIcon(IDI_KEY));
LoadIcon(IDI_ICON4));
LoadIcon(IDI_ICON5));
CListCtrlEx&
ctlList=(CListCtrlEx&
GetListCtrl();
//我不懂的就这句,cListCtrlEx看下面的声明。
ctlList.SetImageList(m_pImageList,LVSIL_SMALL);
////////////
return0;
classCListCtrlEx:
publicCListCtrl//类cListCtrlEx定义。
{…..
classCDaoListView:
publicCListView//cDaoListView定义!
注:
我的问题是GetListCtrl()返回的是一个cListCtrl对象的引用,怎么能把它转换成一个它的派生类对象的