vc++数值转换Word文件下载.docx
- 文档编号:16470960
- 上传时间:2022-11-23
- 格式:DOCX
- 页数:35
- 大小:45.01KB
vc++数值转换Word文件下载.docx
《vc++数值转换Word文件下载.docx》由会员分享,可在线阅读,更多相关《vc++数值转换Word文件下载.docx(35页珍藏版)》请在冰豆网上搜索。
∙BSTR变量
BSTRbstrValue=:
:
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("
constchar*buf=bstrVar;
///不要修改buf中的内容
∙通用方法(针对非COM数据类型)
用sprintf完成转换
charbuffer[200];
charc='
1'
inti=35;
longj=1000;
floatf=1.7320534f;
sprintf(buffer,"
%c"
c);
%d"
i);
j);
%f"
f);
二、字符串转换为其它数据类型
strcpy(temp,"
123"
i=atoi(temp);
l=atol(temp);
∙浮点(double)
d=atof(temp);
CStringname=temp;
∙BSTR变量
...///完成对bstrValue的使用
CComBSTR类型变量可以直接赋值
CComBSTRbstrVar1("
CComBSTRbstrVar2(temp);
_bstr_t类型的变量可以直接赋值
_bstr_tbstrVar1("
_bstr_tbstrVar2(temp);
三、其它数据类型转换到CString
使用CString的成员函数Format来转换,例如:
∙整数(int)
str.Format("
∙浮点数(float)
∙字符串指针(char*)等已经被CString构造函数支持的数据类型可以直接赋值
str=username;
∙对于Format所不支持的数据类型,可以通过上面所说的关于其它数据类型转化到char*的方法先转到char*,然后赋值给CString变量。
四、BSTR、_bstr_t与CComBSTR
∙CComBSTR是ATL对BSTR的封装,_bstr_t是C++对BSTR的封装,BSTR是32位指针,但并不直接指向字串的缓冲区。
char*转换到BSTR可以这样:
BSTRb=_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,最好先用VoidVariantInit(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<
comdef.h>
例如:
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"
(2)通过MultiByteToWideChar函数实现转换,例如:
char*szProgID="
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(0x22,0x98,0x34);
∙从COLORREF类型的颜色值得到RGB三个颜色值
BYTERed=GetRValue(bkcolor);
///得到红颜色
BYTEGreen=GetGValue(bkcolor);
///得到绿颜色
BYTEBlue=GetBValue(bkcolor);
///得到兰颜色
九、注意事项
假如需要使用到ConvertBSTRToString此类函数,需要加上头文件comutil.h,并在setting中加入comsupp.lib或者直接加上#pragmacomment(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的改变而改变,请问能解释一下为什么,如有回答,请通知
wangshaohong@,tx先
}
添加lib支持作者:
磨刀霍霍发表日期:
2001-9-1011:
32:
12
如果不添加会产生错误,在setting中加入comsupp.lib或者直接#pragmacomment(lib,"
微软认为缺省的设置callconvention如果不设置成__cdecl也会出现同样的错误。
1。
int转成cstring?
?
回复人:
caigzhi(caigzhi) (2001-10-1711:
27:
35)得0分
CString的成员函数Format()
inta=2131;
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'
str=*c;
Gu_c_h(Gu) (2001-10-1714:
07:
用_gcvt下面是msdn的例子
Example
/*_GCVT.C:
Thisprogramconverts-3.1415e5
*toitsstringrepresentation.
*/
#include<
stdlib.h>
stdio.h>
voidmain(void)
charbuffer[50];
doublesource=-3.1415e5;
_gcvt(source,7,buffer);
printf("
%fbuffer:
%s'
\n"
source,buffer);
%ebuffer:
Output
-314150.000000buffer:
-314150.'
-3.141500e+005buffer:
49:
56)得6分
inta=-3.1415e5;
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对象的引用,怎么能把它转换成一个它的派生类对象的引用?
c++的类型转换怎么支持?
回复贴子:
lhj(努力加油) (2002-1-2918:
56:
06)得0分
ctlList=(CLis
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- vc 数值 转换