📄 type_convert.htm
字号:
<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
<comdef.h><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",&clsid);<BR>
<LI>根据CLSID得到ProgID<BR>WINOLEAPI ProgIDFromCLSID( REFCLSID
clsid,LPOLESTR * lplpszProgID); <BR>例如我们已经定义了
CLSID_IApplication,下面的代码得到ProgID<BR>LPOLESTR pProgID =
0;<BR>ProgIDFromCLSID(
CLSID_IApplication,&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",&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),&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)->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分 <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分 <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>他们两个的都可以!! <BR><BR>回复人: 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;<BR><BR><BR>回复人: Gu_c_h(Gu) (2001-10-17
14:07:17) 得0分 <BR>用 _gcvt 下面是 msdn
的例子<BR><BR>Example<BR><BR>/* _GCVT.C: This program converts
-3.1415e5<BR>* to its string
representation.<BR>*/<BR><BR>#include
<stdlib.h><BR>#include <stdio.h><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分 <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);<BR><BR><FONT
color=#0033cc>2。基类对象怎么能转换成派生类对象?<BR></FONT>int
CDaoListView::OnCreate(LPCREATESTRUCT
lpCreateStruct) <BR>{<BR>lpCreateStruct->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->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));<BR><BR>CListCtrlEx&
ctlList = (CListCtrlEx&)
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++的类型转换怎么支持? <BR><BR><BR>回复贴子: <BR>回复人: lhj(努力加油) (2002-1-29
18:56:06) 得0分 <BR>CListCtrlEx& ctlList =
(CListCtrlEx&)
GetListCtrl();<BR>这是强制类型转换,&表示是一个引用,lctList的值在这次赋值后不能被修改。<BR><BR>回复人: wwwsq(wwwsq) (2002-1-29
19:09:22)
得0分 <BR>建议你找本C++方面的书看看,VC虽然号称可视,实际上C++基础还是很重要的。<BR><BR><BR>回复人: xcopy(xcopy) (2002-1-29
19:26:16)
得0分 <BR>用dynamic_cast()可以安全的转换。 <BR><BR><FONT
color=#0033cc>3。如何在CString和double之间转换?要求转换之后能保留小数点,保留正负号??<BR></FONT><BR>cstring::format(%.xe)
x为精度位 <BR><BR>回复人: 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 =
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -