⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 type_convert.htm

📁 关于数据类型转换的一些总结
💻 HTM
📖 第 1 页 / 共 5 页
字号:
                      <TR bgColor=#ffffff>
                        <TD width=442>void FAR* byref; </TD>
                        <TD width=338>// Generic ByRef.</TD></TR>
                      <TR bgColor=#ffffff>
                        <TD width=442>char cVal; </TD>
                        <TD width=338>// VT_I1.</TD></TR>
                      <TR bgColor=#ffffff>
                        <TD width=442>unsigned short uiVal; </TD>
                        <TD width=338>// VT_UI2.</TD></TR>
                      <TR bgColor=#ffffff>
                        <TD width=442>unsigned long ulVal; </TD>
                        <TD width=338>// VT_UI4.</TD></TR>
                      <TR bgColor=#ffffff>
                        <TD width=442>int intVal; </TD>
                        <TD width=338>// VT_INT.</TD></TR>
                      <TR bgColor=#ffffff>
                        <TD width=442>unsigned int uintVal; </TD>
                        <TD width=338>// VT_UINT.</TD></TR>
                      <TR bgColor=#ffffff>
                        <TD width=442>char FAR * pcVal; </TD>
                        <TD width=338>// VT_BYREF|VT_I1.</TD></TR>
                      <TR bgColor=#ffffff>
                        <TD width=442>unsigned short FAR * puiVal; </TD>
                        <TD width=338>// VT_BYREF|VT_UI2.</TD></TR>
                      <TR bgColor=#ffffff>
                        <TD width=442>unsigned long FAR * pulVal; </TD>
                        <TD width=338>// VT_BYREF|VT_UI4.</TD></TR>
                      <TR bgColor=#ffffff>
                        <TD width=442>int FAR * pintVal; </TD>
                        <TD width=338>// VT_BYREF|VT_INT.</TD></TR>
                      <TR bgColor=#ffffff>
                        <TD width=442>unsigned int FAR * puintVal; </TD>
                        <TD 
                    width=338>//VT_BYREF|VT_UINT.</TD></TR></TBODY></TABLE><BR>
                    <LI>_variant_t是VARIANT的封装类,其赋值可以使用强制类型转换,其构造函数会自动处理这些数据类型。<BR>使用时需加上#include 
                    &lt;comdef.h&gt;<BR>例如:<BR>long l=222;<BR>ing 
                    i=100;<BR>_variant_t lVal(l);<BR>lVal = (long)i;<BR><BR>
                    <LI>COleVariant的使用与_variant_t的方法基本一样,请参考如下例子:<BR>COleVariant 
                    v3 = "字符串", v4 = (long)1999;<BR>CString str 
                    =(BSTR)v3.pbstrVal;<BR>long i = v4.lVal;<BR><BR></LI></UL>
                  <P><FONT color=#6699ff><B>六、其它一些COM数据类型</B></FONT></P>
                  <UL>
                    <LI>根据ProgID得到CLSID<BR>HRESULT CLSIDFromProgID( LPCOLESTR 
                    lpszProgID,LPCLSID pclsid);<BR>CLSID 
                    clsid;<BR>CLSIDFromProgID( L"MAPI.Folder",&amp;clsid);<BR>
                    <LI>根据CLSID得到ProgID<BR>WINOLEAPI ProgIDFromCLSID( REFCLSID 
                    clsid,LPOLESTR * lplpszProgID); <BR>例如我们已经定义了 
                    CLSID_IApplication,下面的代码得到ProgID<BR>LPOLESTR pProgID = 
                    0;<BR>ProgIDFromCLSID( 
                    CLSID_IApplication,&amp;pProgID);<BR>...///可以使用pProgID 
                    <BR>CoTaskMemFree(pProgID);//不要忘记释放 <BR></LI></UL>
                  <P><FONT 
                  color=#6699ff><B>七、ANSI与Unicode<BR></B></FONT>Unicode称为宽字符型字串,COM里使用的都是Unicode字符串。</P>
                  <UL>
                    <LI>将ANSI转换到Unicode<BR>(1)通过L这个宏来实现,例如: CLSIDFromProgID( 
                    L"MAPI.Folder",&amp;clsid);<BR>(2)通过MultiByteToWideChar函数实现转换,例如:<BR>char 
                    *szProgID = "MAPI.Folder";<BR>WCHAR 
                    szWideProgID[128];<BR>CLSID clsid;<BR>long lLen = 
                    MultiByteToWideChar(CP_ACP,0,szProgID,strlen(szProgID),szWideProgID,sizeof(szWideProgID));<BR>szWideProgID[lLen] 
                    = '\0'; <BR>(3)通过A2W宏来实现,例如: <BR>USES_CONVERSION; 
                    <BR>CLSIDFromProgID( A2W(szProgID),&amp;clsid); 
                    <LI>将Unicode转换到ANSI<BR>(1)使用WideCharToMultiByte,例如:<BR>// 
                    假设已经有了一个Unicode 串 wszSomeString... <BR>char szANSIString 
                    [MAX_PATH]; <BR>WideCharToMultiByte ( CP_ACP, 
                    WC_COMPOSITECHECK, wszSomeString, -1, szANSIString, 
                    sizeof(szANSIString), NULL, NULL ); 
                    <BR>(2)使用W2A宏来实现,例如:<BR>USES_CONVERSION;<BR>pTemp=W2A(wszSomeString); 
                    </LI></UL>
                  <P><FONT color=#6699ff><B>八、其它</B></FONT></P>
                  <UL>
                    <LI>对消息的处理中我们经常需要将WPARAM或LPARAM等32位数据(DWORD)分解成两个16位数据(WORD),例如:<BR>LPARAM 
                    lParam;<BR>WORD loValue = LOWORD(lParam);///取低16位<BR>WORD 
                    hiValue = HIWORD(lParam);///取高16位<BR><BR>
                    <LI>对于16位的数据(WORD)我们可以用同样的方法分解成高低两个8位数据(BYTE),例如:<BR>WORD 
                    wValue;<BR>BYTE loValue = LOBYTE(wValue);///取低8位<BR>BYTE 
                    hiValue = HIBYTE(wValue);///取高8位<BR><BR>
                    <LI>两个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 
                    ); <BR><BR>
                    <LI>两个8位的数据(BYTE)合成16位的数据(WORD)<BR>WORD MAKEWORD( BYTE bLow, 
                    BYTE bHigh ); <BR><BR>
                    <LI>从R(red),G(green),B(blue)三色得到COLORREF类型的颜色值<BR>COLORREF 
                    RGB( BYTE byRed,BYTE byGreen,BYTE byBlue );<BR>例如COLORREF 
                    bkcolor = RGB(0x22,0x98,0x34);<BR><BR>
                    <LI>从COLORREF类型的颜色值得到RGB三个颜色值<BR>BYTE Red = 
                    GetRValue(bkcolor); ///得到红颜色<BR>BYTE Green = 
                    GetGValue(bkcolor); ///得到绿颜色<BR>BYTE Blue = 
                    GetBValue(bkcolor); ///得到兰颜色<BR></LI></UL>
                  <P><FONT 
                  color=#6699ff><B>九、注意事项</B></FONT><BR>假如需要使用到ConvertBSTRToString此类函数,需要加上头文件comutil.h,并在setting中加入comsupp.lib或者直接加上#pragma 
                  comment( lib, "comsupp.lib" )</P>
                  <P>后记:本文匆匆写成,错误之处在所难免,欢迎指正.<BR></P>
                  <P><FONT color=#0033cc>关于把BSTR类型数据转换成CString 
                  类型数据时的问题</FONT><FONT 
                  color=#666666>?</FONT><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><FONT 
                  color=#0033cc>如何转化((list*)fileip.bian)-&gt;liang<BR></FONT>
                  <P><FONT color=#0033cc>关于把CString转化成LPCTSTR的问题</FONT><FONT 
                  color=#666666> 作者:jakiesun 发表日期:2001-9-5 
                  20:08:48</FONT><BR>我记的我以前写过这样一段代码<BR>void 
                  function()<BR>{<BR>CString 
                  str,str1,str2;<BR>function((char*)(LPCTSTR)str1);<BR>str=str1;<BR>...//调试道此发现str2的值随着str的改变而改变,请问能解释一下为什么,如有回答,请通知<BR>wangshaohong@sohu.com,tx先<BR><BR>}</P>
                  <P><FONT color=#0033cc>添加lib支持</FONT><FONT color=#666666> 
                  作者:磨刀霍霍 发表日期:2001-9-10 
                  11:32:12</FONT><BR>如果不添加会产生错误,在setting中加入comsupp.lib或者直接#pragma 
                  comment( lib, "comsupp.lib" )<BR>微软认为缺省的设置call 
                  convention如果不设置成__cdecl也会出现同样的错误。</P>
                  <P><BR><FONT color=#0033cc>1。int 转成cstring 
                  ??<BR></FONT><BR>回复人: caigzhi(caigzhi) (2001-10-17 11:27:35) 
                  得0分&nbsp;<BR>CString 的成员函数Format()<BR><BR>int a = 
                  2131;<BR>CString 
                  str;<BR>str.Format("%d",a);<BR><BR>回复人: tenchi(C与C++之间) (2001-10-17 
                  11:32:12) 得0分&nbsp;<BR>int i=2001;<BR>char 
                  str[10];<BR>_itoa(i,str,10);<BR>CString 
                  szString=str;&nbsp;<BR>回复人: fiolin(幽深的水) (2001-10-17 11:45:40) 
                  得0分&nbsp;<BR>他们两个的都可以!!&nbsp;<BR><BR>回复人: sohucsdnvc(thanks) (2001-10-17 
                  13:24:17) 
                  得0分&nbsp;<BR>那如何把double转成cstring&nbsp;<BR>回复人: yihugang(小虎子) (2001-10-17 
                  13:29:15) 得6分&nbsp;<BR>int i = 2131;<BR>char *c=new 
                  char[20];<BR>CString 
                  str;<BR>sprintf(c,'%d',i);<BR>str=*c;<BR><BR><BR>回复人: Gu_c_h(Gu) (2001-10-17 
                  14:07:17) 得0分&nbsp;<BR>用 _gcvt 下面是 msdn 
                  的例子<BR><BR>Example<BR><BR>/* _GCVT.C: This program converts 
                  -3.1415e5<BR>* to its string 
                  representation.<BR>*/<BR><BR>#include 
                  &lt;stdlib.h&gt;<BR>#include &lt;stdio.h&gt;<BR><BR>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>}<BR><BR><BR>Output<BR><BR>source: -314150.000000 
                  buffer: '-314150.'<BR>source: -3.141500e+005 buffer: 
                  '-314150.'<BR><BR>回复人: Gu_c_h(Gu) (2001-10-17 14:49:56) 
                  得6分&nbsp;<BR>int a = -3.1415e5;<BR>CString 
                  str;<BR>str.Format("%f",a);&nbsp;<BR>回复人: ruixp(锐剑) (2001-10-17 
                  15:06:48) 得6分&nbsp;<BR>CString 的成员函数Format()<BR>int a = 
                  2131;<BR>CString str;<BR>str.Format("%d",a);<BR><BR><FONT 
                  color=#0033cc>2。基类对象怎么能转换成派生类对象?<BR></FONT>int 
                  CDaoListView::OnCreate(LPCREATESTRUCT 
                  lpCreateStruct)&nbsp;<BR>{<BR>lpCreateStruct-&gt;style |= 
                  LVS_REPORT |LVS_EDITLABELS;<BR>if 
                  (CListView::OnCreate(lpCreateStruct) == -1)<BR>return 
                  -1;<BR><BR>//////////// 创建ImageList;<BR>CDaoViewApp * pApp = 
                  (CDaoViewApp *) AfxGetApp();<BR><BR>m_pImageList = new 
                  CImageList();<BR>ASSERT(m_pImageList 
                  !=NULL);<BR>m_pImageList-&gt;Create(16,16,TRUE,4,4);<BR>m_pImageList-&gt;Add(pApp-&gt;LoadIcon(IDI_KEY));<BR>m_pImageList-&gt;Add(pApp-&gt;LoadIcon(IDI_ICON4));<BR>m_pImageList-&gt;Add(pApp-&gt;LoadIcon(IDI_ICON5));<BR><BR>CListCtrlEx&amp; 
                  ctlList = (CListCtrlEx&amp;) 
                  GetListCtrl();//我不懂的就这句,cListCtrlEx看下面的声明。<BR>ctlList.SetImageList 
                  (m_pImageList, LVSIL_SMALL) ;<BR>////////////<BR>return 
                  0;<BR>}<BR><BR>class CListCtrlEx : public 
                  CListCtrl//类cListCtrlEx定义。<BR>{.....<BR>}<BR>class 
                  CDaoListView : public 
                  CListView//cDaoListView定义!<BR>{<BR>...<BR>}<BR>注:我的问题是GetListCtrl()返回的是一个cListCtrl对象的引用,怎么能把它转换成一个它的派生类对象的引用?c++的类型转换怎么支持?&nbsp;<BR><BR><BR>回复贴子:&nbsp;<BR>回复人: lhj(努力加油) (2002-1-29 
                  18:56:06) 得0分&nbsp;<BR>CListCtrlEx&amp; ctlList = 
                  (CListCtrlEx&amp;) 
                  GetListCtrl();<BR>这是强制类型转换,&amp;表示是一个引用,lctList的值在这次赋值后不能被修改。<BR><BR>回复人: wwwsq(wwwsq) (2002-1-29 
                  19:09:22) 
                  得0分&nbsp;<BR>建议你找本C++方面的书看看,VC虽然号称可视,实际上C++基础还是很重要的。<BR><BR><BR>回复人: xcopy(xcopy) (2002-1-29 
                  19:26:16) 
                  得0分&nbsp;<BR>用dynamic_cast()可以安全的转换。&nbsp;<BR><BR><FONT 
                  color=#0033cc>3。如何在CString和double之间转换?要求转换之后能保留小数点,保留正负号??<BR></FONT><BR>cstring::format(%.xe) 
                  x为精度位&nbsp;<BR><BR>回复人: pchaos(杂讲) (2002-1-28 11:21:46) 
                  得0分&nbsp;<BR>CString str;<BR>double db;<BR>str = 
                  "123.456";<BR>db = 
                  atof((LPCTSTR)str);&nbsp;<BR>回复人: hgw111(hg) (2002-1-28 
                  11:52:57) 得0分&nbsp;<BR>CString -&gt; double : atof<BR>double 
                  -&gt;CString :Format&nbsp;<BR>回复人: pchaos(杂讲) (2002-1-28 
                  13:46:04) 得0分&nbsp;<BR>CString str;<BR>double db;<BR>str = 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -