📄 --有关数据类型转换的整理.htm
字号:
<P><BR>对于16位的数据(WORD)我们可以用同样的方法分解成高低两个8位数据(BYTE),例如:<BR>WORD
wValue;<BR>BYTE loValue = LOBYTE(wValue);///取低8位<BR>BYTE
hiValue = HIBYTE(wValue);///取高8位</P>
<P><BR>两个16位数据(WORD)合成32位数据(DWORD,LRESULT,LPARAM,或WPARAM)<BR>LONG
MAKELONG( WORD wLow, WORD wHigh );<BR>WPARAM MAKEWPARAM( WORD
wLow, WORD wHigh ); <BR>LPARAM MAKELPARAM( WORD wLow, WORD
wHigh );<BR>LRESULT MAKELRESULT( WORD wLow, WORD wHigh ); </P>
<P><BR>两个8位的数据(BYTE)合成16位的数据(WORD)<BR>WORD MAKEWORD( BYTE
bLow, BYTE bHigh ); </P>
<P><BR>从R(red),G(green),B(blue)三色得到COLORREF类型的颜色值<BR>COLORREF
RGB( BYTE byRed,BYTE byGreen,BYTE byBlue );<BR>例如COLORREF
bkcolor = RGB(0x22,0x98,0x34);</P>
<P><BR>从COLORREF类型的颜色值得到RGB三个颜色值<BR>BYTE Red =
GetRValue(bkcolor); ///得到红颜色<BR>BYTE Green =
GetGValue(bkcolor); ///得到绿颜色<BR>BYTE Blue =
GetBValue(bkcolor); ///得到兰颜色</P>
<P>九、注意事项<BR>假如需要使用到ConvertBSTRToString此类函数,需要加上头文件comutil.h,并在setting中加入comsupp.lib或者直接加上#pragma
comment( lib, "comsupp.lib" )</P>
<P>后记:本文匆匆写成,错误之处在所难免,欢迎指正.</P>
<P><BR>关于把BSTR类型数据转换成CString
类型数据时的问题?<BR>当我在把BSTR类型数据转换成CString 或 “char*
类型”数据时,发现在BSTR类型字符串较短的情况下没问题,当较长时就会出现<BR>内存读写错了。(在NT,2000下都测试是这样的。)<BR>根据你所说:<BR>1)字符串指针(char
*)等已经被CString构造函数支持的数据类型 可以直接赋值 str = username;<BR>2)当b
为BSTR类型时可以使用<BR>char
*p=_com_util::ConvertBSTRToString(b);<BR>于是以下是对的:<BR>CString
cstr;<BR>BSTR
bstr;<BR>....<BR>cstr=com_util::ConvertBSTRToString(bstr);<BR>...<BR>可是当bstr非常大时(其实,较大时就会)就会出现内存读写错,不知何故。<BR>此外我发现cstr=com_util::ConvertBSTRToString(bstr);<BR>可以简化为
cstr=bstr; 但当bstr较大时同样出现这个问题。<BR>请兄弟帮忙!急。谢谢!</P>
<P>如何转化((list*)fileip.bian)->liang</P>
<P>关于把CString转化成LPCTSTR的问题 作者:jakiesun 发表日期:2001-9-5
20:08:48<BR>我记的我以前写过这样一段代码<BR>void function()<BR>{<BR>CString
str,str1,str2;<BR>function((char*)(LPCTSTR)str1);<BR>str=str1;<BR>...//调试道此发现str2的值随着str的改变而改变,请问能解释一下为什么,如有回答,请通知<BR><A
href="mailto:wangshaohong@sohu.com,tx">wangshaohong@sohu.com,tx</A>先</P>
<P>}</P>
<P>添加lib支持 作者:磨刀霍霍 发表日期:2001-9-10
11:32:12<BR>如果不添加会产生错误,在setting中加入comsupp.lib或者直接#pragma
comment( lib, "comsupp.lib" )<BR>微软认为缺省的设置call
convention如果不设置成__cdecl也会出现同样的错误。</P>
<P><BR>1。int 转成cstring ??</P>
<P>回复人: caigzhi(caigzhi) (2001-10-17 11:27:35) 得0分 <BR>CString
的成员函数Format()</P>
<P>int a = 2131;<BR>CString str;<BR>str.Format("%d",a);</P>
<P>回复人: tenchi(C与C++之间) (2001-10-17 11:32:12) 得0分 <BR>int
i=2001;<BR>char str[10];<BR>_itoa(i,str,10);<BR>CString
szString=str; <BR>回复人: fiolin(幽深的水) (2001-10-17 11:45:40) 得0分
<BR>他们两个的都可以!! </P>
<P>回复人: sohucsdnvc(thanks) (2001-10-17 13:24:17) 得0分
<BR>那如何把double转成cstring <BR>回复人: yihugang(小虎子) (2001-10-17
13:29:15) 得6分 <BR>int i = 2131;<BR>char *c=new
char[20];<BR>CString str;<BR>sprintf(c,'%d',i);<BR>str=*c;</P>
<P><BR>回复人: Gu_c_h(Gu) (2001-10-17 14:07:17) 得0分 <BR>用 _gcvt
下面是 msdn 的例子</P>
<P>Example</P>
<P>/* _GCVT.C: This program converts -3.1415e5<BR>* to its
string representation.<BR>*/</P>
<P>#include <stdlib.h><BR>#include <stdio.h></P>
<P>void main( void )<BR>{<BR>char buffer[50];<BR>double source
= -3.1415e5;<BR>_gcvt( source, 7, buffer );<BR>printf(
"source: %f buffer: '%s'\n", source, buffer );<BR>_gcvt(
source, 7, buffer );<BR>printf( "source: %e buffer: '%s'\n",
source, buffer );<BR>}</P>
<P><BR>Output</P>
<P>source: -314150.000000 buffer: '-314150.'<BR>source:
-3.141500e+005 buffer: '-314150.'</P>
<P>回复人: Gu_c_h(Gu) (2001-10-17 14:49:56) 得6分 <BR>int a =
-3.1415e5;<BR>CString str;<BR>str.Format("%f",a);
<BR>回复人: ruixp(锐剑) (2001-10-17 15:06:48) 得6分 <BR>CString
的成员函数Format()<BR>int a = 2131;<BR>CString
str;<BR>str.Format("%d",a);</P>
<P>2。基类对象怎么能转换成派生类对象?<BR>int
CDaoListView::OnCreate(LPCREATESTRUCT lpCreateStruct)
<BR>{<BR>lpCreateStruct->style |= LVS_REPORT
|LVS_EDITLABELS;<BR>if (CListView::OnCreate(lpCreateStruct) ==
-1)<BR>return -1;</P>
<P>//////////// 创建ImageList;<BR>CDaoViewApp * pApp =
(CDaoViewApp *) AfxGetApp();</P>
<P>m_pImageList = new CImageList();<BR>ASSERT(m_pImageList
!=NULL);<BR>m_pImageList->Create(16,16,TRUE,4,4);<BR>m_pImageList->Add(pApp->LoadIcon(IDI_KEY));<BR>m_pImageList->Add(pApp->LoadIcon(IDI_ICON4));<BR>m_pImageList->Add(pApp->LoadIcon(IDI_ICON5));</P>
<P>CListCtrlEx& ctlList = (CListCtrlEx&)
GetListCtrl();//我不懂的就这句,cListCtrlEx看下面的声明。<BR>ctlList.SetImageList
(m_pImageList, LVSIL_SMALL) ;<BR>////////////<BR>return
0;<BR>}</P>
<P>class CListCtrlEx : public
CListCtrl//类cListCtrlEx定义。<BR>{.....<BR>}<BR>class
CDaoListView : public
CListView//cDaoListView定义!<BR>{<BR>...<BR>}<BR>注:我的问题是GetListCtrl()返回的是一个cListCtrl对象的引用,怎么能把它转换成一个它的派生类对象的引用?c++的类型转换怎么支持?
</P>
<P><BR>回复贴子: <BR>回复人: lhj(努力加油) (2002-1-29 18:56:06) 得0分
<BR>CListCtrlEx& ctlList = (CListCtrlEx&)
GetListCtrl();<BR>这是强制类型转换,&表示是一个引用,lctList的值在这次赋值后不能被修改。</P>
<P>回复人: wwwsq(wwwsq) (2002-1-29 19:09:22) 得0分
<BR>建议你找本C++方面的书看看,VC虽然号称可视,实际上C++基础还是很重要的。</P>
<P><BR>回复人: xcopy(xcopy) (2002-1-29 19:26:16) 得0分
<BR>用dynamic_cast()可以安全的转换。 </P>
<P>3。如何在CString和double之间转换?要求转换之后能保留小数点,保留正负号??</P>
<P>cstring::format(%.xe) x为精度位 </P>
<P>回复人: pchaos(杂讲) (2002-1-28 11:21:46) 得0分 <BR>CString
str;<BR>double db;<BR>str = "123.456";<BR>db =
atof((LPCTSTR)str); <BR>回复人: hgw111(hg) (2002-1-28 11:52:57)
得0分 <BR>CString -> double : atof<BR>double ->CString
:Format <BR>回复人: pchaos(杂讲) (2002-1-28 13:46:04) 得0分
<BR>CString str;<BR>double db;<BR>str = "123.456";<BR>db =
atof((LPCTSTR)str); <BR>db = 777.999;<BR>str.format("%e", db);
</P>
<P>4。字符型要转换成int??<BR>atoi(str) </P>
<P>5。_bstr_t 到 unsigned int??<BR>_bstr_t str;<BR>unsigned int
Length=6;<BR>Length=Length-str.length(); </P>
<P>6。VARIANT类型转换问题?<BR>我在使用MSCOMM中SetOutput()函数时<BR>形参必须为VARIANT变量<BR>如何将其它的数据类型转换为VARIANT类型?<BR>如:Cstring->VARIANT、
*char->VARIANT<BR>我对VARIANT的类型结构体不太熟,请讲详细些(最好有范例),谢谢!</P>
<P>回复贴子: <BR>回复人: vc_xiaoxin(小新) (2001-12-26 15:43:57) 得0分
<BR>VARIANT本身是一个复杂的结构,别的数据怎么转呀?关注
<BR>回复人: mpg_liu(星仁) (2001-12-27 18:33:50) 得10分
<BR>定义一个VARIANT变量后,他应该是一个结构体变量,其中有一个成员是字符型的,给这个成员赋值
<BR>回复人: LLnju(LLnju) (2001-12-27 18:36:10) 得0分 <BR>实在不清楚嘛就用
_variant_t , COleVariant 这些东东嘛,很好用的啊
<BR>回复人: softarts(CDMA2000) (2001-12-27 18:41:32) 得10分
<BR>构造一个就行了。<BR>VARIANT varXX;<BR>CString
strYY;<BR>varXX.vt=VT_BSTR;<BR>varXX.bstrVal =
strYY.allocsysstring();<BR>应该可以了。<BR>回复人: softarts(CDMA2000) (2001-12-27
18:42:11) 得0分 <BR>我也觉得COleVariant要好用一些,呵呵,我都用它。
<BR>回复人: bobofu(有问题要问) (2001-12-27 19:32:18) 得10分 <BR>CString
str;<BR>_variant_t var;<BR>var = _variant_t(str); </P>
<P>7。COleVarant 如何转换为 CString?<BR>CString 如何转换为 char
*<BR>CString 如何转换为 char[xx] ??</P>
<P>CString 如何转换为 char * wsprintf或者=<BR>CString 如何转换为 char[xx]
strcpy() <BR>回复人: SecretGarden(天堂鸟) (2002-1-14 11:55:23) 得0分
<BR>COleVarant封装了VAREANT类型。<BR>VAREANT类型其实是个巨大地Union,里面自然有你<BR>想要地unsigned
char *类型。<BR>CString地GetBuffer和Format可以实现你的后两个问题</P>
<P><BR>8。v_variant_t类型转换成cstring<BR>总提示我cstring未定义<BR>程序如下<BR>_variant_t
vfirstname;//存储的是数据库中的数据<BR>CString
str;//提示出错<BR>vfirstname=pRs->GetCollect
(_variant_t("Phone_Num"));<BR>vfirstname.ChangeType
(VT_BSTR);<BR>str=vfirstname.bstrVal;//提示出错 </P>
<P><BR>回复贴子: <BR>回复人: hydnoahark(诺亚方舟) (2001-11-12 11:56:51)
得10分 <BR>>>CString str;//提示出错<BR>要求include
<afx.h>并且设置Use run-time Library为Multithreaded
<BR>回复人: zhengyun_ustc(^-^) (2001-11-12 12:04:39) 得15分
<BR>CString未定义,说明你的工程没有引用MFC!!</P>
<P>要想使你的工程支持MFC,请按照以下步骤作:<BR>1:在你的stdafx.h的头文件中加入:<BR>#include
"afxtempl.h"<BR>这是一个囊括了MFC的集合定义的头文件,有了它,你的工程就识别Cstring类了。</P>
<P>2:在你的工程设置中,在General页中,选择“MFC”为“Using MFC in a shared
DLL”</P>
<P>OK,现在再编译你的工程即可。 <BR>回复人: zhengyun_ustc(^-^) (2001-11-12
12:06:56) 得5分
<BR>_variant_t的bstrVal成员是BSTR类型。<BR>它是一个指向一个OLECHART*的指针。
<BR>回复人: vickowang(小苍) (2001-11-12 12:48:21) 得5分 <BR>(char
*)_bstr_t(vfirstname)
<BR>回复人: smallfool(smallfool) (2001-11-12 13:52:54) 得4分
<BR>或许你还需要一个从UNICODE字符到ANSI字符的转变函数
<BR>回复人: sun_1112(萧) (2001-11-12 17:34:44) 得0分
<BR>谢谢大家<BR>给我这么大的支持!:)
<BR>回复人: zhengyun_ustc(^-^) (2001-11-14 13:24:07) 得0分
<BR>用vickowang(小苍)的意见可能会有问题,转换出的字符串应该是乱码。</P>
<P>因为(char *)转换需要一个const的字符串资源,才能强制转换。<BR>所以应该:<BR>_bstr_t
bstrTemp = _bstr_t(vfirstname.bstrVal);<BR>TCHAR
szTemp[MAX_PATH];<BR>szTemp = (char*)bstrTemp;</P>
<P>9。char * 转换为TCHAR类型??<BR>直接转换,TCHAR相当于char了<BR>char *
s;<BR>TCHAR * s1=(TCHAR *)s; <BR>回复人: dysxq() (2001-12-21
21:26:25) 得0分 <BR>要看你的程序设置是ANSI还是UNICODE,
如果是ANSI,直接转,如果是UNICODE,TCHAR相当于WCHAR, 要用mbstowcsz转一下
<BR>回复人: xiaoxiaohan(萧晓寒) (2001-12-21 23:52:17) 得0分
<BR>Unicode :宽字节字符集<BR>1.
如何取得一个既包含单字节字符又包含双字节字符的字符串的字符个数?<BR>可以调用Microsoft Visual
C++的运行期库包含函数_mbslen来操作多字节(既包括单字节也包括双字节)字符串。<BR>调用strlen函数,无法真正了解字符串中究竟有多少字符,它只能告诉你到达结尾的0之前有多少个字节。<BR>2.
如何对DBCS(双字节字符集)字符串进行操作?<BR>函数 描述<BR>PTSTR CharNext ( LPCTSTR
); 返回字符串中下一个字符的地址<BR>PTSTR CharPrev ( LPCTSTR, LPCTSTR );
返回字符串中上一个字符的地址<BR>BOOL IsDBCSLeadByte( BYTE );
如果该字节是DBCS字符的第一个字节,则返回非0值<BR>3. 为什么要使用Unicode?<BR>(1)
可以很容易地在不同语言之间进行数据交换。<BR>(2)
使你能够分配支持所有语言的单个二进制.exe文件或DLL文件。<BR>(3) 提高应用程序的运行效率。<BR>Windows
2000是使用Unicode从头进行开发的,如果调用任何一个Windows函数并给它传递一个ANSI字符串,那么系统首先要将字符串转换成<BR>Unicode,然后将Unicode字符串传递给操作系统。如果希望函数返回ANSI字符串,系统就会首先将Unicode字符串转换成ANSI字符串,然后将结<BR>果返回给你的应用程序。进行这些字符串的转换需要占用系统的时间和内存。通过从头开始用Unicode来开发应用程序,就能够使你的应用程序<BR>更加有效地运行。<BR>Windows
CE 本身就是使用Unicode的一种操作系统,完全不支持ANSI Windows函数<BR>Windows 98
只支持ANSI,只能为ANSI开发应用程序。<BR>Microsoft公司将COM从16位Windows转换成Win32时,公司决定需要字符串
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -