VC数据类型详解
- 格式:doc
- 大小:196.50 KB
- 文档页数:13
CString ,BSTR ,LPCTSTR之间关系和区别CString是一个动态TCHAR数组,BSTR是一种专有格式的字符串(需要用系统提供的函数来操纵,LPCTSTR只是一个常量的TCHAR指针。
CString 是一个完全独立的类,动态的TCHAR数组,封装了 + 等操作符和字符串操作方法。
typedef OLECHAR FAR* BSTR;typedef const char * LPCTSTR;vc++中各种字符串的表示法首先char* 是指向ANSI字符数组的指针,其中每个字符占据8位(有效数据是除掉最高位的其他7位),这里保持了与传统的C,C++的兼容。
LP的含义是长指针(long pointer)。
LPSTR是一个指向以‘\0’结尾的ANSI字符数组的指针,与char*可以互换使用,在win32中较多地使用LPSTR。
而LPCSTR中增加的‘C’的含义是“CONSTANT”(常量),表明这种数据类型的实例不能被使用它的API函数改变,除此之外,它与LPSTR是等同的。
1.LP表示长指针,在win16下有长指针(LP)和短指针(P)的区别,而在win32下是没有区别的,都是32位.所以这里的LP和P是等价的.2.C表示const3.T是什么东西呢,我们知道TCHAR在采用Unicode方式编译时是wchar_t,在普通时编译成char.为了满足程序代码国际化的需要,业界推出了Unicode标准,它提供了一种简单和一致的表达字符串的方法,所有字符中的字节都是16位的值,其数量也可以满足差不多世界上所有书面语言字符的编码需求,开发程序时使用Unicode(类型为wchar_t)是一种被鼓励的做法。
LPWSTR与LPCWSTR由此产生,它们的含义类似于LPSTR与LPCSTR,只是字符数据是16位的wchar_t而不是char。
然后为了实现两种编码的通用,提出了TCHAR的定义:如果定义_UNICODE,声明如下:typedef wchar_t TCHAR;如果没有定义_UNICODE,则声明如下:typedef char TCHAR;LPTSTR和LPCTSTR中的含义就是每个字符是这样的TCHAR。
CategoryCD-ROM (1)关闭计算机 (1)重启计算机 (1)枚举所有字体 (1)只运行一个程序实例 (2)得到鼠标位置 (2)显示和隐藏程序菜单 (3)获取可执行文件的图标 (3)窗口自动靠边程序演示 (3)系统菜单添加菜单项 (5)动态增加或删除菜单 (6)改变应用程序的图标 (7)改变窗口标题的方法 (7)剪切板上通过增强元文件拷贝图像数据 (8)剪切板上文本数据的传送 (8)捕捉屏幕图像到剪切板中 (9)将位图缩放显示 (11)改变对话框中控件的颜色 (12)修改窗口外观 (14)获得应用程序主窗口的指针 (15)确定应用程序的路径 (15)获得其他程序的图标 (15)获得各种目录信息 (16)如何自定义消息 (16)改变窗口的缺省风格 (16)将窗口居中显示 (17)一启动就最大化和最小化 (17)限制窗口的大小 (17)创建一个字回绕的CEditView (18)程序保持极小状态 (18)移动窗口 (18)重置窗口的大小 (18)单击窗口标题栏以外区域使窗口移动 (19)改变视窗的背景颜色 (20)防止主框窗口在其说明中显示活动的文档名 (20)获取有关窗口正在处理的当前消息的信息 (21)代码中获取工具条和状态条的指针 (21)使能和禁止工具条的工具提示 (21)如何创建一个不规则形状的窗口 (22)获取应用程序的实例句柄 (24)如何编程结束应用程序 (24)创建和使用无模式对话框 (25)怎样加载其他的应用程序 (26)使窗口始终在最前方 (27)在对话框中显示一个位图 (27)获取一个对话控件的指针 (27)改变控件的字体 (28)OLE控件中使用OLE_COLOR数据类型 (28)在不使用通用文件打开对话的情况下如何显示一个文件列表 (29)旋转按钮控件 (29)用位图显示下压按钮 (29)创建三态下压按钮 (30)如何动态创建控件 (30)限制编辑框中的准许字符 (30)向列表框中添加多个项时防止闪烁 (32)向编辑控件中添加文本 (32)访问预定义的GDI对象 (32)获取GDI对象的属性信息 (33)实现一个橡皮区矩形 (34)更新翻转背景颜色的文本 (36)创建一个具有特定点大小的字体 (36)如何计算一个串的大小 (37)显示旋转文本 (37)显示包含标签字符的串 (39)串太长时如何在其末尾显示一个省略号 (39)为什么即使调用EnableMenuItem菜单项后,菜单项还处于禁止状态 (39)在用户环境中如何确定系统显示元素的颜色 (40)查询和设置系统参数 (40)确定当前屏幕分辨率 (41)使用预定义Windows光标 (41)检索原先的Task Manager应用程序使用的任务列表 (41)确定Windows和Windows系统目录 (42)在哪儿创建临文件 (43)我怎样才能建立一个等待光标 (44)访问桌面窗口 (44)怎样用COLORREF (44)在应用程序中循环浏览已经打开的文档、视图 (45)MFC在窗口标题栏 (45)CD-ROM打开:mciSendString("Set cdAudio door open wait",NULL,0,NULL);关闭:mciSendString("Set cdAudio door closed wait",NULL,0,NULL);关闭计算机OSVERSIONINFO OsVersionInfo; //包含操作系统版本信息的数据结构OsVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);GetVersionEx(&OsVersionInfo); //获取操作系统版本信息if(OsVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS){//Windows98,调用ExitWindowsEx()函数重新启动计算机DWORD dwReserved;ExitWindowsEx(EWX_REBOOT,dwReserved); //可以改变第一个参数,实现注销用户、//关机、关闭电源等操作// 退出前的一些处理程序}重启计算机typedef int (CALLBACK *SHUTDOWNDLG)(int); //显示关机对话框函数的指针HINSTANCE hInst = LoadLibrary("shell32.dll"); //装入shell32.dll SHUTDOWNDLG ShutDownDialog; //指向shell32.dll库中显示关机对话框函数的指针if(hInst != NULL){//获得函数的地址并调用之ShutDownDialog = (SHUTDOWNDLG)GetProcAddress(hInst,(LPSTR)60);(*ShutDownDialog)(0);}枚举所有字体LOGFONT lf;lf.lfCharSet = DEFAULT_CHARSET; // Initialize the LOGFONT structurestrcpy(lf.lfFaceName,"");CClientDC dc (this);// Enumerate the font families::EnumFontFamiliesEx((HDC)dc,&lf,(FONTENUMPROC) EnumFontFamProc,(LPARAM) this,0);//枚举函数int CALLBACK EnumFontFamProc(LPENUMLOGFONT lpelf,LPNEWTEXTMETRIC lpntm,DWORD nFontType,long lparam){// Create a pointer to the dialog windowCDay7Dlg* pWnd = (CDay7Dlg*) lparam;// add the font name to the list boxpWnd ->m_ctlFontList.AddString(lpelf ->elfLogFont.lfFaceName);// Return 1 to continue font enumerationreturn 1;}其中m_ctlFontList是一个列表控件变量只运行一个程序实例if( FindWindow(NULL,"程序标题")) exit(0);或CreateMutx:HANDLE m_hMutex = ::CreateMutex(NULL,true,_T("MBD"));if(GetLastError() == ERROR_ALREADY_EXISTS){ReleaseMutex(m_hMutex);::MessageBox(NULL,_T("应用程序已经运行!"),_T("系统提示"),MB_OK|MB_ICONSTOP);return FALSE;}也可以用CreateThread,方法同CreateMutex得到鼠标位置CPoint pt;GetCursorPos(&pt); //得到位置显示和隐藏程序菜单CWnd *pWnd=AfxGetMainWnd();if(b_m) //隐藏菜单{pWnd->SetMenu(NULL);pWnd->DrawMenuBar();b_m=false;}else{CMenu menu;menu.LoadMenu(IDR_MAINFRAME); ////显示菜单也可改变菜单项pWnd->SetMenu(&menu);pWnd->DrawMenuBar();b_m=true;menu.Detach();}获取可执行文件的图标HICON hIcon=::ExtractIcon(AfxGetInstanceHandle(),_T("NotePad.exe"),0); if (hIcon &&hIcon!=(HICON)-1){pDC->DrawIcon(10,10,hIcon);}DestroyIcon(hIcon);窗口自动靠边程序演示BOOL AdjustPos(CRect* lpRect){//自动靠边int iSX=GetSystemMetrics(SM_CXFULLSCREEN);int iSY=GetSystemMetrics(SM_CYFULLSCREEN);RECT rWorkArea;BOOL bResult = SystemParametersInfo(SPI_GETWORKAREA, sizeof(RECT), &rWorkAre a, 0);CRect rcWA;if(!bResult){//如果调用不成功就利用GetSystemMetrics获取屏幕面积rcWA=CRect(0,0,iSX,iSY);}elsercWA=rWorkArea;int iX=lpRect->left;int iY=lpRect->top;if(iX < rcWA.left + DETASTEP && iX!=rcWA.left){//调整左//pWnd->SetWindowPos(NULL,rcWA.left,iY,0,0,SWP_NOSIZE);lpRect->OffsetRect(rcWA.left-iX,0);AdjustPos(lpRect);return TRUE;}if(iY < rcWA.top + DETASTEP && iY!=rcWA.top){//调整上//pWnd->SetWindowPos(NULL ,iX,rcWA.top,0,0,SWP_NOSIZE);lpRect->OffsetRect(0,rcWA.top-iY);AdjustPos(lpRect);return TRUE;}if(iX + lpRect->Width() > rcWA.right - DETASTEP && iX !=rcWA.right-lpRect->W idth()){//调整右//pWnd->SetWindowPos(NULL ,rcWA.right-rcW.Width(),iY,0,0,SWP_NOSIZE);lpRect->OffsetRect(rcWA.right-lpRect->right,0);AdjustPos(lpRect);return TRUE;}if(iY + lpRect->Height() > rcWA.bottom - DETASTEP && iY !=rcWA.bottom-lpRect->Height()){//调整下//pWnd->SetWindowPos(NULL ,iX,rcWA.bottom-rcW.Height(),0,0,SWP_NOSIZE);lpRect->OffsetRect(0,rcWA.bottom-lpRect->bottom);return TRUE;}return FALSE;}//然后在ONMOVEING事件中使用所下过程调用CRect r=*pRect;AdjustPos(&r);*pRect=(RECT)r;系统菜单添加菜单项给系统菜单添加一个菜单项需要进行下述三个步骤:首先,使用Resource Symbols对话(在View菜单中选择Resource Symbols...可以显示该对话)定义菜单项ID,该ID应大于0x0F而小于0xF000;其次,调用CWnd::GetSystemMenu获取系统菜单的指针并调用CWnd:: Appendmenu将菜单项添加到菜单中。
目录参数设置列表1.通道和传感器的选择组I2.信号检测类型组J3.滤波配置组K4.报警值配置组5.继电器配置组6.OK监控组7串行接口组1.通道和传感器的选择组可以把 VC1100配置为单通道或者双通道模式检测,在单通道模式可以选择通道A或者B在双通道模式,VC1100只接受相同类型和相同灵敏度的传感器。
选择:Y,N功能:激活或者不激活通道AY=YES 通道A激活N=NO 通道A不激活I01=Y:测量采集数据时,连接一个传感器到通道A I01=N:不激活通道A的测量和监控功能选择:Y,N功能:激活或者不激活通道BY=YES 通道B激活N=NO 通道B不激活I01=Y:测量采集数据时,连接一个传感器到通道B I01=N:不激活通道B的测量和监控功能选择:a,v功能:选择传感器类型a= 用加速度传感器v= 用速度传感器通达A和B必须使用相同类型和精度的传感器选择:mV/g,mV/m/s2,mV/ips,mV/mm/s功能:定义传感器灵敏度的单位I04定义的传感器灵敏度的单位适用于两个通道,如果灵敏度的单位与传感器的类型不匹配,VC1100会产生-58的错误。
选择:mV/g或者mV/m/s2 是针对加速度传感器mV/ips,mV/mm/s 是针对速度传感器范围:0.8---3750分辨率: 0.8---0.9991.0---9.9910.0---99.9100---3750功能:传感器灵敏度I05定义了通道A和B的灵敏度。
VC1100只接受以下表格中所列出来的灵敏度:选择:Y,N功能: Y=YES 激活频率响应线性N=NO 不激活频率响应线性作为激活频率响应线性的开关,激活后速度传感器可以测量低频的范围,e.g可以测量传感器自然频率以下的频率(按照传感器的类型,f0<8HZ或者f0<15HZ)标准的VC1100配备了针对于自然频率为8HZ的速度传感器的频率响应线性。
2.信号检测类型组JJ组定义了振动信号时如何被显示的。
VC的sizeof、字节对齐、位域见到N多的笔试题目考到相关内容,作题目时老是非常迷糊,索性一怒,狂看,终于有所得。
在这做个总结:一、VC默认方式的字节对齐:1.数据成员对齐规则:在默认情况下,VC规定各成员变量存放的起始地址相对于结构的起始地址的偏移量:sizeof(类型)或其倍数2.整体对齐规则:结构的总大小也有个约束条件:最大sizeof(类型)的整数倍如:struct MyStruct{char dda;double dda1;int type};//sizeof=1+7+8+4+4=24二、自己设定字节对齐方式VC中提供了#pragma pack(n)来设定变量以n字节对齐方式。
1.数据成员对齐规则:n字节对齐就是说变量存放的起始地址的偏移量:min(sizeof(类型),对齐方式)或其倍数.2.整体对齐规则:结构的总大小也有个约束条件:min(最大的sizeof(类型),对齐方式)的倍数.#pragma pack(push) //保存对齐状态#pragma pack(4)//设定为4字节对齐struct test{char m1; //默认偏移量double m4;//非默认偏移量int m3; //默认偏移量}; //sizeof=1+3+8+4=16应为4的倍数#pragma pack(pop)//恢复对齐状态#pragma pack(push) //保存对齐状态#pragma pack(16)//设定为4字节对齐struct test{char m1;//默认偏移量double m4;//默认偏移量int m3;//默认偏移量}; //sizeof=1+7+8+4+4=24应为8的倍数。
#pragma pack(pop)//恢复对齐状态三、sizeof简单应用1.参数为数据类型或者为一般变量。
例如sizeof(int),sizeof(long)等等。
这种情况要注意的是不同系统系统或者不同编译器得到的结果可能是不同的。
C++:Error: LPWSTR 类型的实参与const.char *类型形参不兼容1. CStringcsPlus;2. CStringcsSummand;3. m_PlusNumber.GetWindowTextW(csPlus);4. m_Summand.GetWindowTextW(csSummand);5.6. intnPlus = atoi(csPlus.GetBuffer(0)); //将编辑框文本转换成整数7. // intnPlus = atoi(strcpy(csPlus.GetBuffer(10),"aa"));8. csPlus.ReleaseBuffer();9. intnSummand = atoi(csSummand.GetBuffer(0));10. csSummand.ReleaseBuffer();11. intnRet = nPlus + nSummand;12. char chRet[128] = {0}; //将结果装换成字符串13. itoa(nRet,chRet,10);14. m_Result.SetWindowTextW(chRet);在5 8 13 行处会报错原因分析:这些代码在VC6 下面是可以的在VC2010下不能通过VC6默认使用字符ANSII编码方式VC2010默认使用UNICODE编码方式为了满足程序代码国际化的需要,业界推出了Unicode标准,它提供了一种简单和一致的表达字符串的方法,所有字符中的字节都是16位的值,其数量也可以满足差不多世界上所有书面语言字符的编码需求,开发程序时使用Unicode(类型为wchar_t)是一种被鼓励的做法。
LPWSTR与LPCWSTR由此产生,它们的含义类似于LPSTR与LPCSTR,只是字符数据是16位的wchar_t而不是char。
CString是一个动态TCHAR数组,BSTR是一种专有格式的字符串(需要用系统提供的函数来操纵,LPCTSTR只是一个常量的TCHAR指针。
VC++中链接数据库并实现(添加、修改、删除、清空)功能VC++中⽤ADO编程⽅法链接数据库并实现添加、修改、删除、清空等功能1、数据库为Microsoft Office Access 2003为例2、数据库名为DataBase.mdb,表名employees,添加编号、学号、姓名字段,类型为⽂本。
数据库放在p5根⽬录下。
3、建⽴新建⼯程MFC AppWizard[exe]名称为p5。
选择基本对话框。
然后添加控件,⼀个列表控件,三个编辑框,五个按钮。
如下在列表控件,右键属性。
设置如下:然后建⽴类向导,在Member V ariables视图中为3个编辑框和1个列表控件添加变量名称和类型如图:五个按钮的ID和名字改为:IDC_BUTADD,添加;IDC_BUTMOD,修改;IDC_BUTDEL,删除;IDC_BUTCLICK,清空;IDC_BUTTON1,退出。
4、为⼯程加类ADO类,在ClassView中视图中在p5 classes上⾯点右键新建类,类的类型选Generic Class,名称为ADO,点确定。
同时在StdAfx.h头⽂件中加⼊ADO动态链接库,代码如下:#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace\rename("EOF","adoEOF")rename("BOF","adoBOF") //导⼊ADO动态链接库在Class View视图中的CP5Dlg中加⼊⾃定义函数AddToGrid和OnButclear。
这两个函数是⼿动添加的。
5、在ADO.app中程序为// ADO.cpp: implementation of the ADO class.////////////////////////////////////////////////////////////////////////#include "stdafx.h"#include "p5.h"#include "ADO.h"#ifdef _DEBUG#undef THIS_FILEstatic char THIS_FILE[]=__FILE__;#define new DEBUG_NEW#endif//////////////////////////////////////////////////////////////////////// Construction/Destruction//////////////////////////////////////////////////////////////////////ADO::ADO(){}ADO::~ADO(){}void ADO::OnInitADOConn(){::CoInitialize(NULL);try{m_pConnection.CreateInstance("ADODB.Connection"); //创建连接对象实例_bstr_t strConnect="DRIVER={Microsoft Access Driver (*.mdb)};\uid=;pwd=;DBQ=DataBase.mdb;";m_pConnection->Open(strConnect,"","",adModeUnknown); //打开数据库}catch(_com_error e){AfxMessageBox(e.Description()); //弹出错误处理}}_RecordsetPtr& ADO::OpenRecordset(CString sql){ASSERT(!sql.IsEmpty()); //SQL语句不能为空try{m_pRecordset.CreateInstance(__uuidof(Recordset)); //创建记录集对象实例m_pRecordset->Open(_bstr_t(sql),m_pConnection.GetInterfacePtr(),adOpenDynamic, adLockOptimistic, adCmdText); //执⾏SQL得到记录集}catch(_com_error e) //捕获可能的异常{AfxMessageBox(e.Description());}return m_pRecordset;}void ADO::CloseRecordset(){if(m_pRecordset->GetState() == adStateOpen) //判断当前的记录集状态m_pRecordset->Close(); //关闭记录集}void ADO::CloseConn(){m_pConnection->Close(); //关闭数据库连接::CoUninitialize(); //释放COM环境}UINT ADO::GetRecordCount(_RecordsetPtr pRecordset){int nCount = 0; //声明保存记录数的变量try{pRecordset->MoveFirst(); //将记录集指针移动到第⼀条记录}catch(...) //捕捉可能出现的错误{return 0; //产⽣错误时返回0}if(pRecordset->adoEOF) //判断记录集中是否没有记录return 0; //⽆记录时返回0while (!pRecordset->adoEOF) //当记录集指针没有指向最后时{pRecordset->MoveNext(); //将记录集指针移动到下⼀条记录nCount = nCount + 1; //记录个数的变量加1}pRecordset->MoveFirst(); //将记录集指针移动到第⼀条记录return nCount; //返回记录数}6、在ADO.h头⽂件中程序为// ADO.h: interface for the ADO class.////////////////////////////////////////////////////////////////////////#if !defined(AFX_ADO_H__E0F8432E_F797_4979_8FB0_EAC60CA6 C7F9__INCLUDED_) #defineAFX_ADO_H__E0F8432E_F797_4979_8FB0_EAC60CA6C7F9__INC LUDED_#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000class ADO{public:_ConnectionPtr m_pConnection; //连接对象指针_RecordsetPtr m_pRecordset; //记录集对象指针public:ADO();virtual ~ADO();void OnInitADOConn(); //连接数据库_RecordsetPtr& OpenRecordset(CString sql); //打开记录集void CloseRecordset(); //关闭记录集void CloseConn(); //关闭数据库连接UINT GetRecordCount(_RecordsetPtr pRecordset); //获得记录数};#endif// !defined(AFX_ADO_H__E0F8432E_F797_4979_8FB0_EAC60CA6C 7F9__INCLUDED_)这是⼀个封装的连接数据库⽂件。
VC++常用数据类型及其操作详解-------西安邮电学院计算机系徐兆元(FLxyzsby@ FLxyzsby@)2004/08/03 目录一.VC常用数据类型列表二.常用数据类型转化2.1数学类型变量与字符串相互转换2.2CString及string,char *与其他数据类型的转换和操作●CString,string,char*的综合比较●数学类型与CString相互转化●CString与char*相互转换举例●CString 与BSTR 型转换●V ARIANT 型转化成CString 型2.3 BSTR、_bstr_t与CComBSTR2.4 V ARIANT 、_variant_t 与COleVariant附录CString及字符串转及操作详解参考书籍:CSDN,<<MFC深入浅出(Second Edit)>>一.VC常用数据类型列表说明:(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*的综合比较>>写的很详细,请大家在仔细阅读他的文章.地址: /joise/或参考附录:(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 = .....; // whateverBSTR bStr = str.AllocSysString();BSTR型转换为CString如果你在UNICODE 模式下编译代码,你可以简单地写成:CString convert(BSTR bStr){if(bStr == NULL)return CString(_T(""));CString s(bStr); // in UNICODE modereturn s;}如果是ANSI 模式CString convert(BSTR b){CString s;if(b == NULL)return s; // empty for NULL BSTR#ifdef UNICODEs = b;#elseLPSTR p = s.GetBuffer(SysStringLen(b) + 1);::WideCharToMultiByte(CP_ACP, // ANSI Code Page0, // no flagsb, // source widechar string-1, // assume NUL-terminatedp, // target bufferSysStringLen(b)+1, // target buffer lengthNULL, // use system default charNULL); // don''t care if default used s.ReleaseBuffer();#endifreturn s;}●V ARIANT 型转化成CString 型V ARIANT 类型经常用来给COM 对象传递参数,或者接收从COM 对象返回的值。
你也能自己编写返回V ARIANT 类型的方法,函数返回什么类型依赖可能(并且常常)方法的输入参数(比如,在自动化操作中,依赖与你调用哪个方法。
IDispatch::Invoke 可能返回(通过其一个参数)一个包含有BYTE、WORD、float、double、date、BSTR 等等V ARIANT 类型的结果,(详见MSDN 上的V ARIANT 结构的定义)。
在下面的例子中,假设类型是一个BSTR的变体,也就是说在串中的值是通过bsrtVal 来引用,其优点是在ANSI 应用中,有一个构造函数会把LPCWCHAR 引用的值转换为一个CString(见BSTR-to-CString 部分)。
在Unicode 模式中,将成为标准的CString 构造函数,参见对缺省::WideCharToMultiByte 转换的告诫,以及你觉得是否可以接受(大多数情况下,你会满意的)。
V ARIANT vaData;vaData = m_com.YourMethodHere();ASSERT(vaData.vt == VT_BSTR);CString strData(vaData.bstrVal);你还可以根据vt 域的不同来建立更通用的转换例程。