?? 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 + -