C++型別轉換

一劍平江湖發表於2015-03-10

[轉]VC++資料型別轉換大全


  1. int i = 100;
  2. long l = 2001;
  3. float f=300.2;
  4. double d=12345.119;
  5. char username[]="程佩君";
  6. char temp[200];
  7. char *buf;
  8. CString str;
  9. _variant_t v1;
  10. _bstr_t v2;

 

一、其它資料型別轉換為字串


短整型(int)

  1. itoa(i,temp,10);///將i轉換為字串放入temp中,最後一個數字表示十進位制
  2. itoa(i,temp,2); ///按二進位制方式轉換


長整型(long)

  1. ltoa(l,temp,10);


浮點數(float,double)
用fcvt可以完成轉換,這是MSDN中的例子:

  1. int decimal, sign;
  2. char *buffer;
  3. double source = 3.1415926535;
  4. buffer = _fcvt( source, 7, &decimal, &sign );


執行結果:source: 3.1415926535 buffer: '31415927' decimal: 1 sign: 0
decimal表示小數點的位置,sign表示符號:0為正數,1為負數 
CString變數

  1. str = "2008北京奧運";
  2. buf = (LPSTR)(LPCTSTR)str;


BSTR變數

  1. BSTR bstrValue = ::SysAllocString(L"程式設計師");
  2. char * buf = _com_util::ConvertBSTRToString(bstrValue);
  3. SysFreeString(bstrValue);
  4. AfxMessageBox(buf);
  5. delete(buf);

CComBSTR變數

  1. CComBSTR bstrVar("test");
  2. char *buf = _com_util::ConvertBSTRToString(bstrVar.m_str);
  3. AfxMessageBox(buf);
  4. delete(buf);

 

_bstr_t變數
_bstr_t型別是對BSTR的封裝,因為已經過載了=操作符,所以很容易使用

  1. _bstr_t bstrVar("test");
  2. const char *buf = bstrVar;///不要修改buf中的內容
  3. AfxMessageBox(buf);


通用方法(針對非COM資料型別)
用sprintf完成轉換

  1. char buffer[200];
  2. char c = '1';
  3. int i = 35;
  4. long j = 1000;
  5. float f = 1.7320534f;
  6. sprintf( buffer, "%c",c);
  7. sprintf( buffer, "%d",i);
  8. sprintf( buffer, "%d",j);
  9. sprintf( buffer, "%f",f);

 

二、字串轉換為其它資料型別

  1. strcpy(temp,"123");

 

短整型(int)

  1. i = atoi(temp);


長整型(long)

  1. l = atol(temp);


浮點(double)

  1. d = atof(temp);


CString變數

  1. CString name = temp;


BSTR變數

  1. BSTR bstrValue = ::SysAllocString(L"程式設計師");
  2. ///完成對bstrValue的使用
  3. SysFreeString(bstrValue);

 

CComBSTR變數
CComBSTR型別變數可以直接賦值

  1. CComBSTR bstrVar1("test");
  2. CComBSTR bstrVar2(temp);

 

_bstr_t變數
_bstr_t型別的變數可以直接賦值

  1. _bstr_t bstrVar1("test");
  2. _bstr_t bstrVar2(temp);


三、其它資料型別轉換到CString 
使用CString的成員函式Format來轉換,例如:


整數(int)

  1. str.Format("%d",i);


浮點數(float)

  1. str.Format("%f",i);


字串指標(char *)等已經被CString建構函式支援的資料型別可以直接賦值

  1. str = username;


對於Format所不支援的資料型別,可以通過上面所說的關於其它資料型別轉化到char *的方法先轉到char *,然後賦值給CString變數。

四、BSTR、_bstr_t與CComBSTR


CComBSTR 是ATL對BSTR的封裝,_bstr_t是C++對BSTR的封裝,BSTR是32位指標,但並不直接指向字串的緩衝區。
char *轉換到BSTR可以這樣:

  1. BSTR b=_com_util::ConvertStringToBSTR("資料");///使用前需要加上comutil.h和comsupp.lib
  2. SysFreeString(bstrValue);


反之可以使用

  1. char *p=_com_util::ConvertBSTRToString(b);


delete p;
具體可以參考一,二段落裡的具體說明。

CComBSTR與_bstr_t對大量的操作符進行了過載,可以直接進行=,!=,==等操作,所以使用非常方便。
特別是_bstr_t,建議大家使用它。

五、VARIANT 、_variant_t 與 COleVariant


VARIANT的結構可以參考標頭檔案VC98\Include\OAIDL.H中關於結構體tagVARIANT的定義。
對於VARIANT變數的賦值:首先給vt成員賦值,指明資料型別,再對聯合結構中相同資料型別的變數賦值,舉個例子:

  1. VARIANT va;
  2. int a=2001;
  3. va.vt=VT_I4;///指明整型資料
  4. va.lVal=a; ///賦值

 

對於不馬上賦值的VARIANT,最好先用Void VariantInit(VARIANTARG FAR* pvarg);進行初始化,其本質是將vt設定為VT_EMPTY,下表我們列舉vt與常用資料的對應關係:

  1. Byte bVal; // VT_UI1.
  2. Short iVal; // VT_I2.
  3. long lVal; // VT_I4.
  4. float fltVal; // VT_R4.
  5. double dblVal; // VT_R8.
  6. VARIANT_BOOL boolVal; // VT_BOOL.
  7. SCODE scode; // VT_ERROR.
  8. CY cyVal; // VT_CY.
  9. DATE date; // VT_DATE.
  10. BSTR bstrVal; // VT_BSTR.
  11. DECIMAL FAR* pdecVal // VT_BYREF|VT_DECIMAL.
  12. IUnknown FAR* punkVal; // VT_UNKNOWN.
  13. IDispatch FAR* pdispVal; // VT_DISPATCH.
  14. SAFEARRAY FAR* parray; // VT_ARRAY|*.
  15. Byte FAR* pbVal; // VT_BYREF|VT_UI1.
  16. short FAR* piVal; // VT_BYREF|VT_I2.
  17. long FAR* plVal; // VT_BYREF|VT_I4.
  18. float FAR* pfltVal; // VT_BYREF|VT_R4.
  19. double FAR* pdblVal; // VT_BYREF|VT_R8.
  20. VARIANT_BOOL FAR* pboolVal; // VT_BYREF|VT_BOOL.
  21. SCODE FAR* pscode; // VT_BYREF|VT_ERROR.
  22. CY FAR* pcyVal; // VT_BYREF|VT_CY.
  23. DATE FAR* pdate; // VT_BYREF|VT_DATE.
  24. BSTR FAR* pbstrVal; // VT_BYREF|VT_BSTR.
  25. IUnknown FAR* FAR* ppunkVal; // VT_BYREF|VT_UNKNOWN.
  26. IDispatch FAR* FAR* ppdispVal; // VT_BYREF|VT_DISPATCH.
  27. SAFEARRAY FAR* FAR* pparray; // VT_ARRAY|*.
  28. VARIANT FAR* pvarVal; // VT_BYREF|VT_VARIANT.
  29. void FAR* byref; // Generic ByRef.
  30. char cVal; // VT_I1.
  31. unsigned short uiVal; // VT_UI2.
  32. unsigned long ulVal; // VT_UI4.
  33. int intVal; // VT_INT.
  34. unsigned int uintVal; // VT_UINT.
  35. char FAR * pcVal; // VT_BYREF|VT_I1.
  36. unsigned short FAR * puiVal; // VT_BYREF|VT_UI2.
  37. unsigned long FAR * pulVal; // VT_BYREF|VT_UI4.
  38. int FAR * pintVal; // VT_BYREF|VT_INT.
  39. unsigned int FAR * puintVal; //VT_BYREF|VT_UINT.


_variant_t是VARIANT的封裝類,其賦值可以使用強制型別轉換,其建構函式會自動處理這些資料型別。
使用時需加上#include <comdef.h>
例如:

  1. long l=222;
  2. ing i=100;
  3. _variant_t lVal(l);
  4. lVal = (long)i;

 


COleVariant的使用與_variant_t的方法基本一樣,請參考如下例子:

  1. COleVariant v3 = "字串", v4 = (long)1999;
  2. CString str =(BSTR)v3.pbstrVal;
  3. long i = v4.lVal;

 


六、其它一些COM資料型別

根據ProgID得到CLSID

  1. HRESULT CLSIDFromProgID( LPCOLESTR lpszProgID,LPCLSID pclsid);
  2. CLSID clsid;
  3. CLSIDFromProgID( L"MAPI.Folder",&clsid);

 

根據CLSID得到ProgID

  1. WINOLEAPI ProgIDFromCLSID( REFCLSID clsid,LPOLESTR * lplpszProgID);


例如我們已經定義了 CLSID_IApplication,下面的程式碼得到ProgID

  1. LPOLESTR pProgID = 0;
  2. ProgIDFromCLSID( CLSID_IApplication,&pProgID);///可以使用pProgID
  3. CoTaskMemFree(pProgID);//不要忘記釋放

 

七、ANSI與Unicode
Unicode稱為寬字元型字串,COM裡使用的都是Unicode字串。

將ANSI轉換到Unicode
(1)通過L這個巨集來實現,例如:

 

  1. CLSIDFromProgID( L"MAPI.Folder",&clsid);

 

(2)通過MultiByteToWideChar函式實現轉換,例如:

 

  1. char *szProgID = "MAPI.Folder";
  2. WCHAR szWideProgID[128];
  3. CLSID clsid;
  4. long lLen = MultiByteToWideChar(CP_ACP,0,szProgID,strlen(szProgID),szWideProgID,sizeof(szWideProgID));
  5. szWideProgID[lLen] = '\0';

 

(3)通過A2W巨集來實現,例如:

  1. USES_CONVERSION;
  2. CLSIDFromProgID( A2W(szProgID),&clsid);


將Unicode轉換到ANSI
(1)使用WideCharToMultiByte,例如:

  1. // 假設已經有了一個Unicode 串 wszSomeString...
  2. char szANSIString [MAX_PATH];
  3. WideCharToMultiByte ( CP_ACP, WC_COMPOSITECHECK, wszSomeString, -1, szANSIString, sizeof(szANSIString), NULL, NULL );


(2)使用W2A巨集來實現,例如:

  1. USES_CONVERSION;
  2. pTemp=W2A(wszSomeString);

八、其它

對訊息的處理中我們經常需要將WPARAM或LPARAM等32位資料(DWORD)分解成兩個16位資料(WORD),例如:

  1. LPARAM lParam;
  2. WORD loValue = LOWORD(lParam);///取低16位
  3. WORD hiValue = HIWORD(lParam);///取高16位


對於16位的資料(WORD)我們可以用同樣的方法分解成高低兩個8位資料(BYTE),例如:

  1. WORD wValue;
  2. BYTE loValue = LOBYTE(wValue);///取低8位
  3. BYTE hiValue = HIBYTE(wValue);///取高8位


兩個16位資料(WORD)合成32位資料(DWORD,LRESULT,LPARAM,或WPARAM)

  1. LONG MAKELONG( WORD wLow, WORD wHigh );
  2. WPARAM MAKEWPARAM( WORD wLow, WORD wHigh );
  3. LPARAM MAKELPARAM( WORD wLow, WORD wHigh );
  4. LRESULT MAKELRESULT( WORD wLow, WORD wHigh );


兩個8位的資料(BYTE)合成16位的資料(WORD)

  1. WORD MAKEWORD( BYTE bLow, BYTE bHigh );


從R(red),G(green),B(blue)三色得到COLORREF型別的顏色值

  1. COLORREF RGB( BYTE byRed,BYTE byGreen,BYTE byBlue );

 

例如COLORREF bkcolor = RGB(0x22,0x98,0x34);


從COLORREF型別的顏色值得到RGB三個顏色值

  1. BYTE Red = GetRValue(bkcolor); ///得到紅顏色
  2. BYTE Green = GetGValue(bkcolor); ///得到綠顏色
  3. BYTE Blue = GetBValue(bkcolor); ///得到蘭顏色

 

九、注意事項 
假如需要使用到ConvertBSTRToString此類函式,需要加上標頭檔案comutil.h,並在setting中加入comsupp.lib或者直接加上#pragma comment( lib, "comsupp.lib" )

後記:本文匆匆寫成,錯誤之處在所難免,歡迎指正.


關於把BSTR型別資料轉換成CString 型別資料時的問題?
當我在把BSTR型別資料轉換成CString 或 “char* 型別”資料時,發現在BSTR型別字串較短的情況下沒問題,當較長時就會出現
記憶體讀寫錯了。(在NT,2000下都測試是這樣的。)
根據你所說:
1)字串指標(char *)等已經被CString建構函式支援的資料型別 可以直接賦值 str = username;
2)當b 為BSTR型別時可以使用

  1. char *p=_com_util::ConvertBSTRToString(b);


於是以下是對的:

  1. CString cstr;
  2. BSTR bstr;
  3. ....
  4. cstr=com_util::ConvertBSTRToString(bstr);
  5. ...

 

可是當bstr非常大時(其實,較大時就會)就會出現記憶體讀寫錯,不知何故。
此外我發現cstr=com_util::ConvertBSTRToString(bstr);
可以簡化為 cstr=bstr; 但當bstr較大時同樣出現這個問題。
請兄弟幫忙!急。謝謝!

如何轉化((list*)fileip.bian)->liang

關於把CString轉化成LPCTSTR的問題 作者:jakiesun 發表日期:2001-9-5 20:08:48
我記的我以前寫過這樣一段程式碼

  1. void function()
  2. {
  3. CString str,str1,str2;
  4. function((char*)(LPCTSTR)str1);
  5. str=str1;
  6. ...//除錯道此發現str2的值隨著str的改變而改變,請問能解釋一下為什麼,如有回答,請通知
  7. wangshaohong@sohu.com,tx先
  8. }

 

新增lib支援 作者:磨刀霍霍 發表日期:2001-9-10 11:32:12
如果不新增會產生錯誤,在setting中加入comsupp.lib或者直接#pragma comment( lib, "comsupp.lib" )
微軟認為預設的設定call convention如果不設定成__cdecl也會出現同樣的錯誤。


1。int 轉成cstring ??

回覆人: caigzhi(caigzhi) (2001-10-17 11:27:35) 得0分 
CString 的成員函式Format()

int a = 2131;
CString str;
str.Format("%d",a);

回覆人: tenchi(C與C++之間) (2001-10-17 11:32:12) 得0分 
int i=2001;
char str[10];
_itoa(i,str,10);
CString szString=str; 
回覆人: fiolin(幽深的水) (2001-10-17 11:45:40) 得0分 
他們兩個的都可以!!

回覆人: sohucsdnvc(thanks) (2001-10-17 13:24:17) 得0分 
那如何把double轉成cstring 
回覆人: yihugang(小虎子) (2001-10-17 13:29:15) 得6分 
int i = 2131;
char *c=new char[20];
CString str;
sprintf(c,'%d',i);
str=*c;


回覆人: Gu_c_h(Gu) (2001-10-17 14:07:17) 得0分 
用 _gcvt 下面是 msdn 的例子

Example

/* _GCVT.C: This program converts -3.1415e5
* to its string representation.
*/

#include <stdlib.h>
#include <stdio.h>

void main( void )
{
char buffer[50];
double source = -3.1415e5;
_gcvt( source, 7, buffer );
printf( "source: %f buffer: '%s'\n", source, buffer );
_gcvt( source, 7, buffer );
printf( "source: %e buffer: '%s'\n", source, buffer );
}


Output

source: -314150.000000 buffer: '-314150.'
source: -3.141500e+005 buffer: '-314150.'

回覆人: Gu_c_h(Gu) (2001-10-17 14:49:56) 得6分 
int a = -3.1415e5;
CString str;
str.Format("%f",a); 
回覆人: ruixp(銳劍) (2001-10-17 15:06:48) 得6分 
CString 的成員函式Format()
int a = 2131;
CString str;
str.Format("%d",a);

2。基類物件怎麼能轉換成派生類物件?
int CDaoListView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
lpCreateStruct->style |= LVS_REPORT |LVS_EDITLABELS;
if (CListView::OnCreate(lpCreateStruct) == -1)
return -1;

//////////// 建立ImageList;
CDaoViewApp * pApp = (CDaoViewApp *) AfxGetApp();

m_pImageList = new CImageList();
ASSERT(m_pImageList !=NULL);
m_pImageList->Create(16,16,TRUE,4,4);
m_pImageList->Add(pApp->LoadIcon(IDI_KEY));
m_pImageList->Add(pApp->LoadIcon(IDI_ICON4));
m_pImageList->Add(pApp->LoadIcon(IDI_ICON5));

CListCtrlEx& ctlList = (CListCtrlEx&) GetListCtrl();//我不懂的就這句,cListCtrlEx看下面的宣告。
ctlList.SetImageList (m_pImageList, LVSIL_SMALL) ;
////////////
return 0;
}

class CListCtrlEx : public CListCtrl//類cListCtrlEx定義。
{.....
}
class CDaoListView : public CListView//cDaoListView定義!
{
...
}
注:我的問題是GetListCtrl()返回的是一個cListCtrl物件的引用,怎麼能把它轉換成一個它的派生類物件的引用?c++的型別轉換怎麼支援?


回覆貼子: 
回覆人: lhj(努力加油) (2002-1-29 18:56:06) 得0分 
CListCtrlEx& ctlList = (CListCtrlEx&) GetListCtrl();
這是強制型別轉換,&表示是一個引用,lctList的值在這次賦值後不能被修改。

回覆人: wwwsq(wwwsq) (2002-1-29 19:09:22) 得0分 
建議你找本C++方面的書看看,VC雖然號稱可視,實際上C++基礎還是很重要的。


回覆人: xcopy(xcopy) (2002-1-29 19:26:16) 得0分 
用dynamic_cast()可以安全的轉換。

3。如何在CString和double之間轉換?要求轉換之後能保留小數點,保留正負號??

cstring::format(%.xe) x為精度位

回覆人: pchaos(雜講) (2002-1-28 11:21:46) 得0分 
CString str;
double db;
str = "123.456";
db = atof((LPCTSTR)str); 
回覆人: hgw111(hg) (2002-1-28 11:52:57) 得0分 
CString -> double : atof
double ->CString :Format 
回覆人: pchaos(雜講) (2002-1-28 13:46:04) 得0分 
CString str;
double db;
str = "123.456";
db = atof((LPCTSTR)str); 
db = 777.999;
str.format("%e", db);

4。字元型要轉換成int??
atoi(str)

5。_bstr_t 到 unsigned int??
_bstr_t str;
unsigned int Length=6;
Length=Length-str.length();

6。VARIANT型別轉換問題?
我在使用MSCOMM中SetOutput()函式時
形參必須為VARIANT變數
如何將其它的資料型別轉換為VARIANT型別?
如:Cstring->VARIANT、 *char->VARIANT
我對VARIANT的型別結構體不太熟,請講詳細些(最好有範例),謝謝!

回覆貼子: 
回覆人: vc_xiaoxin(小新) (2001-12-26 15:43:57) 得0分 
VARIANT本身是一個複雜的結構,別的資料怎麼轉呀?關注 
回覆人: mpg_liu(星仁) (2001-12-27 18:33:50) 得10分 
定義一個VARIANT變數後,他應該是一個結構體變數,其中有一個成員是字元型的,給這個成員賦值 
回覆人: LLnju(LLnju) (2001-12-27 18:36:10) 得0分 
實在不清楚嘛就用 _variant_t , COleVariant 這些東東嘛,很好用的啊 
回覆人: softarts(CDMA2000) (2001-12-27 18:41:32) 得10分 
構造一個就行了。
VARIANT varXX;
CString strYY;
varXX.vt=VT_BSTR;
varXX.bstrVal = strYY.allocsysstring();
應該可以了。
回覆人: softarts(CDMA2000) (2001-12-27 18:42:11) 得0分 
我也覺得COleVariant要好用一些,呵呵,我都用它。 
回覆人: bobofu(有問題要問) (2001-12-27 19:32:18) 得10分 
CString str;
_variant_t var;
var = _variant_t(str);

7。COleVarant 如何轉換為 CString?
CString 如何轉換為 char *
CString 如何轉換為 char[xx] ??

CString 如何轉換為 char * wsprintf或者=
CString 如何轉換為 char[xx] strcpy() 
回覆人: SecretGarden(天堂鳥) (2002-1-14 11:55:23) 得0分 
COleVarant封裝了VAREANT型別。
VAREANT型別其實是個巨大地Union,裡面自然有你
想要地unsigned char *型別。
CString地GetBuffer和Format可以實現你的後兩個問題


8。v_variant_t型別轉換成cstring
總提示我cstring未定義
程式如下
_variant_t vfirstname;//儲存的是資料庫中的資料
CString str;//提示出錯
vfirstname=pRs->GetCollect (_variant_t("Phone_Num"));
vfirstname.ChangeType (VT_BSTR);
str=vfirstname.bstrVal;//提示出錯


回覆貼子: 
回覆人: hydnoahark(諾亞方舟) (2001-11-12 11:56:51) 得10分 
>>CString str;//提示出錯
要求include <afx.h>並且設定Use run-time Library為Multithreaded 
回覆人: zhengyun_ustc(^-^) (2001-11-12 12:04:39) 得15分 
CString未定義,說明你的工程沒有引用MFC!!

要想使你的工程支援MFC,請按照以下步驟作:
1:在你的stdafx.h的標頭檔案中加入:
#include "afxtempl.h"
這是一個囊括了MFC的集合定義的標頭檔案,有了它,你的工程就識別Cstring類了。

2:在你的工程設定中,在General頁中,選擇“MFC”為“Using MFC in a shared DLL”

OK,現在再編譯你的工程即可。 
回覆人: zhengyun_ustc(^-^) (2001-11-12 12:06:56) 得5分 
_variant_t的bstrVal成員是BSTR型別。
它是一個指向一個OLECHART*的指標。 
回覆人: vickowang(小蒼) (2001-11-12 12:48:21) 得5分 
(char *)_bstr_t(vfirstname) 
回覆人: smallfool(smallfool) (2001-11-12 13:52:54) 得4分 
或許你還需要一個從UNICODE字元到ANSI字元的轉變函式 
回覆人: sun_1112(蕭) (2001-11-12 17:34:44) 得0分 
謝謝大家
給我這麼大的支援!:) 
回覆人: zhengyun_ustc(^-^) (2001-11-14 13:24:07) 得0分 
用vickowang(小蒼)的意見可能會有問題,轉換出的字串應該是亂碼。

因為(char *)轉換需要一個const的字串資源,才能強制轉換。
所以應該:
_bstr_t bstrTemp = _bstr_t(vfirstname.bstrVal);
TCHAR szTemp[MAX_PATH];
szTemp = (char*)bstrTemp;

9。char * 轉換為TCHAR型別??
直接轉換,TCHAR相當於char了
char * s;
TCHAR * s1=(TCHAR *)s; 
回覆人: dysxq() (2001-12-21 21:26:25) 得0分 
要看你的程式設定是ANSI還是UNICODE, 如果是ANSI,直接轉,如果是UNICODE,TCHAR相當於WCHAR, 要用mbstowcsz轉一下 
回覆人: xiaoxiaohan(蕭曉寒) (2001-12-21 23:52:17) 得0分 
Unicode :寬位元組字符集
1. 如何取得一個既包含單位元組字元又包含雙位元組字元的字串的字元個數?
可以呼叫Microsoft Visual C++的執行期庫包含函式_mbslen來操作多位元組(既包括單位元組也包括雙位元組)字串。
呼叫strlen函式,無法真正瞭解字串中究竟有多少字元,它只能告訴你到達結尾的0之前有多少個位元組。
2. 如何對DBCS(雙位元組字符集)字串進行操作?
函式 描述
PTSTR CharNext ( LPCTSTR ); 返回字串中下一個字元的地址
PTSTR CharPrev ( LPCTSTR, LPCTSTR ); 返回字串中上一個字元的地址
BOOL IsDBCSLeadByte( BYTE ); 如果該位元組是DBCS字元的第一個位元組,則返回非0值
3. 為什麼要使用Unicode?
(1) 可以很容易地在不同語言之間進行資料交換。
(2) 使你能夠分配支援所有語言的單個二進位制.exe檔案或DLL檔案。
(3) 提高應用程式的執行效率。
Windows 2000是使用Unicode從頭進行開發的,如果呼叫任何一個Windows函式並給它傳遞一個ANSI字串,那麼系統首先要將字串轉換成
Unicode,然後將Unicode字串傳遞給作業系統。如果希望函式返回ANSI字串,系統就會首先將Unicode字串轉換成ANSI字串,然後將結
果返回給你的應用程式。進行這些字串的轉換需要佔用系統的時間和記憶體。通過從頭開始用Unicode來開發應用程式,就能夠使你的應用程式
更加有效地執行。
Windows CE 本身就是使用Unicode的一種作業系統,完全不支援ANSI Windows函式
Windows 98 只支援ANSI,只能為ANSI開發應用程式。
Microsoft公司將COM從16位Windows轉換成Win32時,公司決定需要字串的所有COM介面方法都只能接受Unicode字串。
4. 如何編寫Unicode原始碼?
Microsoft公司為Unicode設計了WindowsAPI,這樣,可以儘量減少程式碼的影響。實際上,可以編寫單個原始碼檔案,以便使用或者不使用
Unicode來對它進行編譯。只需要定義兩個巨集(UNICODE和_UNICODE),就可以修改然後重新編譯該原始檔。
_UNICODE巨集用於C執行期標頭檔案,而UNICODE巨集則用於Windows標頭檔案。當編譯原始碼模組時,通常必須同時定義這兩個巨集。
5. Windows定義的Unicode資料型別有哪些?
資料型別 說明
WCHAR Unicode字元
PWSTR 指向Unicode字串的指標
PCWSTR 指向一個恆定的Unicode字串的指標
對應的ANSI資料型別為CHAR,LPSTR和LPCSTR。
ANSI/Unicode通用資料型別為TCHAR,PTSTR,LPCTSTR。
6. 如何對Unicode進行操作?
字符集 特性 例項
ANSI 操作函式以str開頭 strcpy
Unicode 操作函式以wcs開頭 wcscpy
MBCS 操作函式以_mbs開頭 _mbscpy
ANSI/Unicode 操作函式以_tcs開頭 _tcscpy(C執行期庫)
ANSI/Unicode 操作函式以lstr開頭 lstrcpy(Windows函式)
所有新的和未過時的函式在Windows2000中都同時擁有ANSI和Unicode兩個版本。ANSI版本函式結尾以A表示;Unicode版本函式結尾以W表示。
Windows會如下定義:
#ifdef UNICODE
#define CreateWindowEx CreateWindowExW
#else
#define CreateWindowEx CreateWindowExA
#endif // !UNICODE
7. 如何表示Unicode字串常量?
字符集 例項
ANSI “string”
Unicode L“string”
ANSI/Unicode T(“string”)或_TEXT(“string”)if( szError[0] == _TEXT(‘J’) ){ }
8. 為什麼應當儘量使用作業系統函式?
這將有助於稍稍提高應用程式的執行效能,因為作業系統字串函式常常被大型應用程式比如作業系統的外殼程式Explorer.exe所使用。由於
這些函式使用得很多,因此,在應用程式執行時,它們可能已經被裝入RAM。
如:StrCat,StrChr,StrCmp和StrCpy等。
9. 如何編寫符合ANSI和Unicode的應用程式?
(1) 將文字串視為字元陣列,而不是chars陣列或位元組陣列。
(2) 將通用資料型別(如TCHAR和PTSTR)用於文字字元和字串。
(3) 將顯式資料型別(如BYTE和PBYTE)用於位元組、位元組指標和資料快取。
(4) 將TEXT巨集用於原義字元和字串。
(5) 執行全域性性替換(例如用PTSTR替換PSTR)。
(6) 修改字串運算問題。例如函式通常希望在字元中傳遞一個快取的大小,而不是位元組。這意味著不應該傳遞sizeof(szBuffer),而應該傳
遞(sizeof(szBuffer)/sizeof(TCHAR)。另外,如果需要為字串分配一個記憶體塊,並且擁有該字串中的字元數目,那麼請記住要按位元組來
分配記憶體。這就是說,應該呼叫malloc(nCharacters *sizeof(TCHAR)),而不是呼叫malloc(nCharacters)。
10. 如何對字串進行有選擇的比較?
通過呼叫CompareString來實現。
標誌 含義
NORM_IGNORECASE 忽略字母的大小寫
NORM_IGNOREKANATYPE 不區分平假名與片假名字元
NORM_IGNORENONSPACE 忽略無間隔字元
NORM_IGNORESYMBOLS 忽略符號
NORM_IGNOREWIDTH 不區分單位元組字元與作為雙位元組字元的同一個字元
SORT_STRINGSORT 將標點符號作為普通符號來處理
11. 如何判斷一個文字檔案是ANSI還是Unicode?
判斷如果文字檔案的開頭兩個位元組是0xFF和0xFE,那麼就是Unicode,否則是ANSI。
12. 如何判斷一段字串是ANSI還是Unicode?
用IsTextUnicode進行判斷。IsTextUnicode使用一系列統計方法和定性方法,以便猜測快取的內容。由於這不是一種確切的科學方法,因此 
IsTextUnicode有可能返回不正確的結果。
13. 如何在Unicode與ANSI之間轉換字串?
Windows函式MultiByteToWideChar用於將多位元組字串轉換成寬字串;函式WideCharToMultiByte將寬字串轉換成等價的多位元組字串。

回覆人: xtky_limi(痛在心中笑在臉上) (2001-12-22 0:35:58) 得0分 
上面說的已經比較全了。 
回覆人: xtky_limi(痛在心中笑在臉上) (2001-12-22 0:38:13) 得0分 
TEXT是巨集
相當於L##

它可以根據編譯環境確定為DBMS,還是UNICODE字符集

10。int型別轉換為CString型別?
回覆人: tjmxf(天涯) (2001-12-17 19:59:34) 得0分 
itoa() 
回覆人: zf925(天下哪來那麼多高手) (2001-12-17 20:00:30) 得22分 
char m[20];
str=str + itoa(i,m,10); 
回覆人: yuezifeng(wybzd) (2001-12-17 20:00:50) 得22分 
CString str;
str.Format("%d",i);

回覆人: kingfish(今飛) (2001-12-17 20:06:27) 得0分 
str.Format("%s%d",str,i); 
回覆人: tanyajun(談子) (2001-12-17 20:09:25) 得0分 
CString str="test";
int i=11;
CString str1;
str1.Format("%d",i);
str = str+str1;

回覆人: guanjinke(綸巾客) (2001-12-17 20:10:42) 得0分 
int i=11;
CString str="test";
CString addition;
addition.Format("%d",i);
str+=addition;
就可以了。

11。關於sprintf型別轉換的問題
sprintf(buf,"select price from ls01 where p_date>='%'",t_date)
其中t_date是CTime型別,%後面應該是什麼呢?%s是String型別,%c是char,那麼CTime型對應的是什麼呢? 

回覆人: yakai(日落長河) (2001-12-17 17:45:47) 得0分 
sprintf(buf,"select price from ls01 where p_date>='%S'",(LPCSTR)t_date.Format( "%A, %B %d, %Y" ));
如果不行,就
char temp[50];
CString str=t_date.Format( "%A, %B %d, %Y" );
strcpy(temp,(LPCSTR)str);
sprintf(buf,"select price from ls01 where p_date>='%S'",temp);
CTime::Format返回CString 
回覆人: loh(樂嘯天涯) (2001-12-17 17:52:57) 得0分 
wait

don't know 
回覆人: masterz() (2001-12-17 20:21:05) 得0分 
SQL語句中日期要寫成字串"yyyymmdd"


12。型別轉換 unsigned int <==>CString??
回覆次數:8
發表時間:2001-12-17 10:25:23

unsigned int f;//unsigned int 0~4294967295
CString g;
f=2300000000;
g.Format("%d",f);
AfxMessageBox(g);
出錯。


回覆人: ydogg(灰毛兔頻頻) (2001-12-17 10:31:29) 得0分 
unsigned int f;//unsigned int 0~4294967295
CString g;
f=2300000000;
g.Format("%d",f);
MessageBox(g);//使用AfxMessageBox,需要視窗的句炳引數

回覆人: asdmusic8(asdmusic8) (2001-12-17 10:35:15) 得0分 
我 AfxMessageBox(g); 和MessageBox(g); 都不錯。
錯的是g.從 2300000000=》1994967296

回覆人: asdmusic8(asdmusic8) (2001-12-17 10:36:10) 得0分 
是2300000000=》-1994967296 型別轉換錯。

回覆人: ydogg(灰毛兔頻頻) (2001-12-17 10:37:54) 得6分 
g.Format("%u",f);

回覆人: asdmusic8(asdmusic8) (2001-12-17 10:40:24) 得0分 
to dgsnmpoperate 那怎麼從 CString ==>>unsigned int 
回覆人: kingfish(今飛) (2001-12-17 10:42:10) 得6分 
既然是 unsigned int,
超過 0x7f000000 (2130706432) 當然不能用 %d (signed int)用%u 
回覆人: kingfish(今飛) (2001-12-17 10:44:57) 得8分 
CString ==>>unsigned int 
char *p = (LPSTR)(LPCSTR) g;
f = atoi(p);

13。static_cast、dynamic_cast 和直接型別轉換(如 (void *)p )的區別?
發表時間:2001-12-14 9:31:13

先拷貝MSDN中的一小段話:
class B { ... };
class C : public B { ... };
class D : public C { ... };

void f(D* pd)
{
C* pc = dynamic_cast<C*>(pd); // ok: C is a direct base class
// pc points to C subobject of pd

B* pb = dynamic_cast<B*>(pd); // ok: B is an indirect base class
// pb points to B subobject of pd 
...
}
我已經知道 static_cast 和 dynamic_cast 的作用,但MSDN中並沒有提到這兩個操作符與直接型別轉換如
void f(D* pd)
{
C* pc = (C*)(pd);

B* pb = (B*)(pd); 
...
}
的不同啊。不知道那位知道的告訴一聲,在此不勝感謝,50分奉上。

回覆貼子:ysdesigned(清泉) (2001-12-14 10:03:07) 得0分 
static_cast、dynamic_cast 代 替 簡 單 的 強 制 轉 化, 從 而 消 除 多 繼 承 帶 來 的 歧 義。 使 用 這 兩 個 運 算 符 號, 我 們可以 在 對 象 運 行 過 程 中 獲 取 對 象 的 類 型 信 息
dynamic_cast 用於多型型別的轉換
static_cast 用於非多型型別的轉換

回覆人: masterz() (2001-12-14 10:05:48) 得0分 
static_cast<...>compile時能發現不正確的指標型別轉換
dynamic_cast<...>執行時如果發現是不正確的指標型別轉換會返回NULL
(void*)強制轉換,如果是不正確的指標型別轉換,沒有辦法檢查,不如上面2中安全 
回覆人: meady() (2001-12-14 11:29:05) 得0分 
型別安全 
回覆人: bluecrest(為什麼我的VC還是那麼的菜) (2001-12-14 11:45:34) 得0分 
com技術內幕介紹過
我剛看完就忘了

14。byte資料型別轉換成int型??
我用byte型讀進一組資料想把他轉成int型進行運算如何做呢?
如果再把int型轉回byte又怎麼實現呢?

回覆人: louifox(蘭陵笑笑生) (2001-12-6 9:18:38) 得0分 
用下面這些巨集:
WORD MAKEWORD(
BYTE bLow, 
BYTE bHigh 
);
BYTE LOBYTE(
WORD wValue 
);
BYTE HIBYTE(
WORD wValue 
);

回覆人: chskim(大刀闊斧) (2001-12-6 9:21:04) 得0分 
int i;
BYTE b;
b=128;
i=(int)b;

回覆人: nannet(似的) (2001-12-6 9:38:24) 得0分 
這個巨集怎麼用呀?有沒有簡單一點兒的,我現在能把BYTE 轉成INT 型了,再轉回去直接賦值可以嗎? 
回覆人: louifox(蘭陵笑笑生) (2001-12-6 9:46:24) 得20分 
WORD wa;
BYTE ba=32,bb=64;
wa=MAKEWORD(ba,bb);
...
WORD wa=1234;
BYTE ba,bb;
ba=LOBYTE(wa);
bb=LOBYTE(wa);

回覆人: nannet(似的) (2001-12-6 9:54:55) 得0分 
問題解決了,多謝各位

15。型別轉換的問題,unsigned int --> lptstr/lpctstr??
發表時間:2001-8-7 23:49:41
如果強制轉換的話,會出現致命錯誤,有什麼好的辦法呢?
能列舉一些其他的辦法嗎?
謝謝大蝦!

回覆人: AlphaOne(總是第一個倒下) (2001-8-8 0:02:43) 得5分 
你為什麼要強行轉換呢?
如果你是要把int 的值作為 lptstr/lpctstr 的內容的話,
可以用CString:
unsigned int a = 100;
LPCTSTR lpText;
CString str;
str.Format("%d",a);
lpText = (LPCTSTR)str;

回覆人: tryibest(編の魂) (2001-8-8 8:20:20) 得5分 
wsprintf(str,"%u",ui); 
回覆人: zzh() (2001-8-8 9:04:39) 得5分 
這種情況不需要進行強制轉換,直接使用wsprintf就可以了。 
回覆人: GJA106(中文字元) (2001-8-8 10:10:51) 得5分 
unsigned int m_na=22;
LPTSTR lptstr;
wsprintf(lptstr,"%u",m_na);

16。關於COM型別轉換問題??
我定義了兩個變數,一個是void *piaRef=new unsigned char[1000];另一個是m_Temp=new CComVariant();我的問題是如何將piaRef中的值
COPY到m_Temp中。

回覆人: nichang() (2001-11-21 15:34:04) 得0分 
CComBSTR bsRef=piaRef;
m_Temp=bsRef.copy() 
回覆人: VincentChin(瘟神) (2001-11-21 17:04:24) 得0分 
CComBSTR bsRef=piaRef;
//error C2440: 'initializing' : cannot convert from 'void *' to 'class ATL::CComBSTR'
m_Temp=bsRef.copy();
//error C2440: '=' : cannot convert from 'unsigned short *' to 'class ATL::CComVariant *' 
回覆人: nichang() (2001-11-21 17:14:28) 得0分 
將void*改為unsigned char * 
回覆人: VincentChin(瘟神) (2001-11-21 17:22:22) 得0分 
我用CComBSTR bsRef=(unsigned char*)piaRef,也不行嗎? 
回覆人: VincentChin(瘟神) (2001-11-21 17:28:06) 得0分 
會報錯:
error C2440: 'type cast' : cannot convert from 'unsigned char *' to 'class ATL::CComBSTR' 
回覆人: nichang() (2001-11-22 9:12:14) 得0分 
m_Temp=::SysAllocString((OLECHAR *)piaRef) 
回覆人: VincentChin(瘟神) (2001-11-22 10:43:07) 得0分 
//error C2440: '=' : cannot convert from 'unsigned short *' to 'class ATL::CComVariant *' 
回覆人: VincentChin(瘟神) (2001-11-22 11:22:35) 得0分 
m_Temp=new CComVariant(::SysAllocString(OLECHAR *)piaRef));沒有出錯,但是我的m_Temp是COM元件中的一個PROPERTY,我想返回的是
unsigned char型別(單位元組),但經過上述轉換後,就不再是單位元組了呀!怎麼辦? 
回覆人: jiangsheng(蔣晟) (2001-11-22 11:36:58) 得0分 
把這個屬性的型別改成BSTR 
回覆人: GrayWhite(灰白) (2001-11-22 12:01:09) 得0分 
m_Temp = new CComVariant((char*) piaRef);就可以了。VB就是用的BSTR,你要給誰用阿?VC不用VARIANT的。 
回覆人: GrayWhite(灰白) (2001-11-22 12:18:18) 得19分 
哦,我明白了,你要各位元組陣列:
SAFEARRAY *psa = SafeArrayCreateVector(VT_UI1, 0, 1000);
if (!psa)
_com_issue_error(ERROR_NOT_ENOUGH_MEMORY);

HRESULT hr
for (long i = 0; i < 2; i ++)
{
if (FAILED (hr = SafeArrayPutElement(psa, &i, piaRef + i)))
_com_issue_error(hr);
}

_variant_t va; // include <comdef.h>
va.vt = VT_ARRAY | VT_UI1;
va.parray = psa;

m_Temp = new CComVariant(va); 
回覆人: VincentChin(瘟神) (2001-11-22 14:21:08) 得0分 
SafeArrayPutElement(psa, &i, piaRef + i)
//error C2036: 'void *' : unknown size 
回覆人: VincentChin(瘟神) (2001-11-22 14:46:05) 得0分 
To GrayWhite:為什麼要for(long i=0;i<2;i++)? 
回覆人: nichang() (2001-11-22 15:16:35) 得0分 
到底你想怎樣轉換嘛,是將陣列內的值拷貝到CComVariant中存為字串嗎? 
回覆人: VincentChin(瘟神) (2001-11-22 15:28:35) 得0分 
我是想把piaRef中的值照原樣返回給其它程式使用。我正在做的是一個COM元件。謝謝各位! 
回覆人: nichang() (2001-11-22 15:34:40) 得10分 
unsigned char *s=new unsigned char[1000];
strcpy((char*)s,"1234");//可以用你自己方法設定s中的值。
BSTR bstrS;
oleS=A2WBSTR((char*)s);//將char*轉換成BSTR型別

CComVariant comVT;
comVT=oleS;//將BSTR轉成CComVariant,這裡一步也可,comVT=A2WBSTR((char*)s);

回覆人: VincentChin(瘟神) (2001-11-22 16:54:07) 得0分 
謝謝你!
但我還有一個問題,就是如果在s中有'\0'之類的東西我該怎麼返回呢?char *遇到'\0'會認為到頭了。完整的設計是這樣的,我定義一個void * 用來從一個外部裝置獲取資料,該資料應該是unsigned char,我想把這個返回的資料作為屬性傳出,讓其它應用使用(如VB)。 
回覆人: nichang() (2001-11-22 17:18:09) 得0分 
將'\0'轉換成其它如'\1'就OK了, 
回覆人: jiangsheng(蔣晟) (2001-11-22 18:07:16) 得0分 
用字串陣列 
回覆人: VincentChin(瘟神) (2001-11-23 15:54:39) 得0分 
謝謝各位的回覆!我的問題解決了!如下:
SAFEARRAY *psa = SafeArrayCreateVector(VT_UI1, 0, 1000);
if (!psa)
return S_FALSE;
HRESULT hr;
for (long i = 0; i < 1000; i ++)
if (FAILED (hr = SafeArrayPutElement(psa, &i, ((unsigned char*)piaRefTemplate) + i)))
return S_FALSE;
VARIANT va;
va.vt = VT_ARRAY | VT_UI1;
va.parray = psa;
CComVariant *m_Temp = new CComVariant();
m_Temp->Copy(&va);

17。型別轉換 static_cast reinterprete_cast 的區別??
static_cast reinterprete_cast 的區別

回覆人: tar(GPS) (2001-11-21 10:06:41) 得0分 
static_cast會檢查轉換型別健的相關性
如果沒有的畫會有編譯錯誤
reinterprete_cast就是硬轉了 
回覆人: tigerwoods(tao) (2001-11-21 12:28:19) 得0分 
是否可以這樣理解:在多重繼承中,static_cast可實現物件指標的移動,從而指向正確的父類物件部分,而reinterprete_cast不作偏移? 
回覆人: liu_feng_fly(我恨死驅動程式了,哎,就是為了混口飯吃) (2001-11-21 12:35:14) 得0分 
在多重繼承中可以用dynamic_cast啊

18。那如何取得CString中的字串??
回覆人: nichang() (2001-11-5 17:06:00) 得0分 
=(LPCTSTR)CString變數 
回覆人: snake1122(領悟) (2001-11-5 17:12:16) 得0分 
方法太多了:
GetAt,Left,Mid,Right等等,就看你怎麼取了! 
回覆人: dusb(保時捷) (2001-11-5 17:34:29) 得0分 
可是不管是GetAt,Left,Mid,Right返回型別都是CString,還是不能用,我是要取其中的字串,奇怪的是,VC中沒有string型別。(我要的字串是給樹型控制元件中的分支名稱) 
回覆人: Alps_lou(雲飛揚) (2001-11-5 17:41:36) 得0分 
有string型別的啊,要包含<string> 
回覆人: luxes() (2001-11-5 17:42:19) 得0分 
加上(LPCTSTR),相當於一個const char *了,還不能用? 
回覆人: wt007(tt) (2001-11-5 17:48:33) 得0分 
GetBuffer 
回覆人: espon99() (2001-11-5 17:54:06) 得20分 
(LPSTR)(LPCTSTR)

回覆人: ineedyou(古寺僧) (2001-11-5 17:59:29) 得0分 
...m_str.GetBuffer(needlen)...;
....
m_str.ReleaseBuffer() 
回覆人: dusb(保時捷) (2001-11-6 15:08:36) 得0分 
espon99大俠,果然是絕招,不過能否解釋一下啊?

19。如何從CString型別轉換為Unicode string 型別?
回覆人: ychener(貧血) (2001-10-20 10:28:48) 得0分 
CString本身就支援Unicode的。 
只要你選擇的是UniCode編譯,生成的可執行程式就是支援UniCode的

回覆人: ychener(貧血) (2001-10-20 10:30:04) 得0分 
CString類是自適應的就像TCHAR一樣,如果你定義了UniCode巨集 就會以UniCode編譯

回覆人: xjl1980_81(阿龍) (2001-10-20 10:35:16) 得0分 
不是呀,我有個函式中有一個引數需Unicode string 型別的,比如應該填L"abc",而且引號中的內容要有變化,現在我有一個 temp變數,是CString型別的,如何用呀? 
回覆人: xt_jat(桑巴) (2001-10-20 10:39:37) 得0分 
_T()
_TEXT()
行不行? 
回覆人: xjl1980_81(阿龍) (2001-10-20 10:43:18) 得0分 
不行 
回覆人: Jeffery__Chen() (2001-10-20 11:04:53) 得0分 
強制轉化:
CString temp;
WCHAR wTemp = (WCHAR)temp; 
回覆人: xjl1980_81(阿龍) (2001-10-20 11:37:06) 得0分 
to:Jeffery__Chen() 
不對呀,出現不能轉換的錯誤 
回覆人: hongzhh(關兒) (2001-10-20 11:39:42) 得0分 
問題是這樣的:
temp 是 CString型別變數,值為zhh
現在有一個API 
PCCERT_CONTEXT WINAPI CertFindCertificateInStore(
HCERTSTORE hCertStore, 
DWORD dwCertEncodingType, 
DWORD dwFindFlags, 
DWORD dwFindType, 
const void *pvFindPara, //此處用 L"zhh" 沒問題 
//請問怎麼轉換 可以 用temp

PCCERT_CONTEXT pPrevCertContext 
);

在此謝謝大家,請幫忙看看

回覆人: hongzhh(關兒) (2001-10-20 13:27:10) 得0分 
WCHAR wszDomain[256]; 
MultiByteToWideChar( CP_ACP, 0, temp,
strlen(temp)+1, wszUserName, 
sizeof(wszUserName)/sizeof(wszUserName[0]) );


wszUserName就是轉換後的值

回覆人: ychener(貧血) (2001-10-23 11:43:05) 得0分 
只要你用的是CString的函式就行的,如果你要用類似strcpy函式時,看看MSDN中一般情況下都有響應的函式對於Unicode的。只要換成_tcscpy等等。 
回覆人: ychener(貧血) (2001-10-23 11:44:10) 得0分 
你有沒有定義Unicode巨集? 
20。請問在用ATL且不支援MFC的元件開發中,如何將從資料庫中讀到的DATE資料型別轉換回為字串??

復人: zhxuys(zhxuys) (2001-9-24 10:36:47) 得0分 
ATL把datetime型別的列對映為DBTIMESTAMP型別,可取出該型別的year、month、day等,然後將這些資料傳遞迴客戶端,在客戶端用CTime來構造 
回覆人: YUANXU(旭) (2001-9-24 11:18:14) 得0分 
to zhxuys:CTime是MFC類,在ATL 不支援MFC時不能用。DATE其實質是個double* 
回覆人: zhxuys(zhxuys) (2001-9-24 11:57:01) 得0分 
你在客戶端與伺服器端只用ATL規定的資料型別或VARIANT型別,而在客戶端,可以用MFC來重新構造想要的資料結構

21。型別轉換,CString to wchar_t ??

CString ss("aabb");
wchar_t* cc;
cc=ss.AllocSysString();

22。如何將CString型別轉換為_bstr_t型別?
回覆人: wei97081116(韋小寶) (2001-9-4 11:19:30) 得20分 
CString b;
_bstr_t a;
a=(_bstr_t)b;

回覆人: zhaozhen1212(趙振) (2001-9-18 1:30:18) 得0分 
_bstr_t a=b.AllocSysString();;

23。如何把一個CString型別轉換成一個普通的字串,如char*?

回覆人: liu_feng_fly(我恨死驅動程式了,哎,就是為了混口飯吃) (2001-9-17 18:00:52) 得0分 
所以,直接用就可以,因為類裡邊有這樣的轉換函式 
回覆人: ydogg(灰毛兔頻頻) (2001-9-17 18:01:21) 得0分 
CString show;

char *p = show.GetBuffer(show.GetLength()); 
回覆人: jiangping_zhu(娜可露露之風之刃) (2001-9-17 18:02:05) 得0分 
(char*)(LPCTSTR)str 
回覆人: bmouse(老鼠) (2001-9-18 0:10:56) 得0分 
同意樓上! 
回覆人: bmouse(老鼠) (2001-9-18 0:13:22) 得0分 
你還可以通過GetBuff來直接操作CString的緩衝區,不過要記著釋放緩衝區.

24。CString 型別轉換成 unsigned char型別嗎??
回覆人: LJN(*)風流倜儻無人及,玉樹偏又臨風立(*) (2001-9-17 12:46:01) 得0分 
可以用CString.GetBuffer函式 
回覆人: xpmao() (2001-9-17 13:09:09) 得0分 
CString strWork;
MessageBox(0,(LPSTR)strWork,0,0);
或MessageBox(0,strWork.GetBuffer(0),0,0);

回覆人: sandd(降龍掌) (2001-9-17 13:17:32) 得0分 
CString string;

(LPCTSTR)string; 
回覆人: jeff_hunter(PandaLee) (2001-9-17 13:45:30) 得0分 
(unsigned char *)(LPCTSTR) 
回覆人: fandh(好了) (2001-9-17 14:00:57) 得0分 
用(unsigned char *)(LPCTSTR)即可 
回覆人: ygd(ygd) (2001-9-17 16:11:17) 得0分 
unsigned char *p;
CString str;
int length=str.GetLength();
for(int i=0;i<length;i++)
p[i]=str.GetAt(i); 
回覆人: swordbroken(斷劍書生) (2001-9-17 16:25:57) 得0分 
CString str;
unsigned char string[30];
strcpy(string,str);

25。何將一個unsigned int 型別變數值賦給型別為unsigned short的變數,並保證數值不丟失(當然數值在一定範圍內)?
回覆人: maxsuy(魔法師兔子) (2001-8-14 16:37:30) 得0分 
直接=就OK了 
回覆人: oppmm(ppmm) (2001-8-14 16:38:11) 得0分 
直接賦值 
回覆人: milefo(彌勒佛) (2001-8-14 16:40:40) 得0分 
如果數值在一定範圍內怎麼回丟失呢?
unsigned short a;
unsigned int b;
a=( b & 0xffff);
你試試看吧!

26。CString ----char* 
定義了char* aa的變數,現在有一個CString的變數bb,怎樣把bb的值賦給aa呢?

回覆人: emmai(WaTaXiWaWaTaXi) (2001-8-10 11:57:33) 得0分 
aa=bb.GetBuffer(); 
回覆人: hswqs(??????????????????) (2001-8-10 11:59:01) 得0分 
aa= (LPSTR)(LPCTSTR)bb; 
回覆人: ydogg(灰毛兔) (2001-8-10 12:27:23) 得0分 
1.aa=bb.GetBuffer(bb.GetLenth());//第一種方法
2.aa= (LPSTR)(LPCTSTR)bb; //第二種方法 
回覆人: zhizhi() (2001-8-10 13:16:23) 得0分 
aa= (char *)(LPCTSTR)bb,hehe

27。在一個COM的介面函式中有一個 BSTR* 型別的引數,需要把一個 char * 型別轉換為 BSTR* 型別,不知道如何轉換? 由於呼叫這個函式後需要把這個引數值再取出來所以只能用指標,另外在呼叫的時候應該用什麼型別的資料傳遞引數呢?大蝦幫忙。

BSTR bstr = SysAllocString(L"字串");
這樣轉換,用的時候你用地址操作符&啊,要不指標還得new

回覆人: yongyue2000i(小呂) (2001-9-9 18:38:26) 得13分 
CString str = "abcd";
BSTR bstr = str.AllocSysString(); 
回覆人: houjzs() (2001-9-9 19:14:44) 得13分 
BSTR b = SysAllocString(OLESTR("your string"));

28。要把一個double的數字輸出到CEdit控制元件是否需要型別轉換?
回覆人: jiangsheng(蔣晟) (2001-8-24 14:46:17) 得0分 
void AFXAPI DDX_Text( CDataExchange* pDX, int nIDC, double& value ); 
回覆人: xiezhsh(雪中行) (2001-8-24 14:56:22) 得0分 
假如你的CEdit相關的成員變數是Double型的,那根本用不著.(ClassWizard增加成員變數的對話方塊中,Variable Type選擇Double可) 
回覆人: xiezhsh(雪中行) (2001-8-24 14:58:16) 得0分 
假如你的CEdit相關的成員變數不是Double型的,是CString型,那就需要用ltoa()來轉換成CString型, 
回覆人: haven(大天) (2001-8-24 14:58:32) 得0分 
m_Edit.Fromat("%l",VarBouble);
updatedata(false); 
回覆人: 12345678() (2001-8-24 14:59:54) 得0分 
CString m_Edit.Format("%lf", doubleVar); 
GetDlgItem(EditID)->SetWindowText(m_strEdit);

29。該如何把 WINDOWPLACEMENT * 轉換成 char **型別??

(char**)&pWP

30。怎樣把CString的型別轉換成char*型的?
回覆人: dcz(dcz) (2001-8-19 19:13:27) 得5分 
// str is CString var
char* temp = strdup(str);
...
free(temp); 
回覆人: yu900(疾風之狼) (2001-8-19 19:57:25) 得0分 
getbuffer();即可! 
回覆人: aileen_long(挑戰2001) (2001-8-19 21:10:35) 得0分 
同意樓上的意見! 
回覆人: czh912() (2001-8-19 21:27:08) 得0分 
char buf[20];
printf(buf,"%s",string);

回覆人: casl(casl) (2001-8-19 22:59:44) 得5分 
CString s("abc");
char* temp=s.GetBuffer(10);
...
s.ReleaseBuffer(); 
回覆人: cocia(高亞) (2001-8-19 23:04:23) 得0分 
char* temp=s.GetBuffer(10);
10是什麼意思啊

回覆人: kevin_dong(夢仙人) (2001-8-20 10:26:35) 得0分 
// str is CString var
char* temp = strdup(str);
// free
free(temp); 
我的這段程式碼在一個程式中能通過編譯,但是在另外一箇中總是出現cannot convert parameter 1 from 'class CString' to 'const char *'的錯誤。str和temp的型別都一樣。這是為什麼?

回覆人: dcz(dcz) (2001-8-20 14:13:45) 得0分 
you may setting your compiler option to UNICODE, in this case, declare the var:

// str is CString var
_TCHAR* temp = _tcsdup(str);

// free
free(str);

31。SA,SB為兩個結構型別??
SA* A;
SB* B;
(SB*)A->...(呼叫函式)
請問此時A的型別,是指向SA還是SB
此時編譯器是生成一個臨時指標嗎?
另外,
B=(SB*)A;此時A又是什麼型別???

回覆貼子: 
回覆人: ddeng(登登) (2001-8-9 17:13:58) 得0分 
A的型別始終是SA *
B的型別始終是SB *
當進行強制型別轉換時使的是臨時指標 
回覆人: gold_water(風雨無阻) (2001-8-9 17:30:46) 得0分 
同意樓上的。

32。char buff[100],char UserName[50][100],怎麼將buff的值傳給UserName,是其成為UserName陣列中的某一項呢??

//0=<i<50
strcpy(UserName[i],buff); 
回覆人: Ashura(阿修羅) (2001-7-26 10:08:20) 得0分 
呵呵,benbensan搶先一步。 
回覆人: tuita(鬥牛士) (2001-7-26 10:13:22) 得0分 
for (i=0;i<100;i++)
*(*(username+x)+i)=*(buffer+i)
其中0《X〈50
benbensan寫的也對

回覆人: kekeke(我是來向大家學習的) (2001-7-26 10:24:22) 得0分 
那反過來呢?把UserName中的某一項讀出賦值給buff呢?怎麼弄? 
回覆人: benbensan(笨笨三) (2001-7-26 10:26:53) 得0分 
//0=<i<50
strcpy(UserName[i],buff); 
回覆人: benbensan(笨笨三) (2001-7-26 10:28:15) 得0分 
對不起,能錯了,不過建議你看一下C語言了的指標和陣列
//0=<i<50
strcpy(buff,UserName[i]);

回覆人: jfzsl(剿匪總司令) (2001-7-26 10:32:57) 得0分 
好好看看老潭的書先!OK? 
回覆人: kekeke(我是來向大家學習的) (2001-7-26 10:44:25) 得0分 
好。。。。!

33。請問怎樣把SYSTEMTIME型別轉換成time_t型別?
SYSTEMTIME st;
GetLocalTime(&st);
CTime tm(st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond);
time_t t = tm.GetTime();

34。unsigned char Exponent[10]; //e
unsigned long eBytes; //e的位元組數
如何轉換成DWord型! ??

用強制型別轉換呀
(DWord)eBeytes;
(DWord)Exponent[i];//(0<=i<=10);

回覆人: xjl1980_81(阿龍) (2001-7-26 16:47:29) 得0分 
我是說把e轉換成DWORD型
也就是說把Exponent中的內容轉換成DWORD型

回覆人: cloudshadow1(雲影) (2001-7-26 17:13:30) 得0分 
用強制型別轉換就可以了,(DWORD的高24位自動加0)
DWORD Des[10]
for (int i=0;i<11;i++)
Des[i]=Exponent[i];
至於那個ULONG的也是用強制型別軟換就可以了

35。請問怎樣把time_t型別轉換成SYSTEMTIME型別?
回覆人: haven(大天) (2001-7-26 17:12:36) 得0分 
typedef struct _SYSTEMTIME
typedef long time_t
很明顯不行嘛! 
回覆人: facexy(FACE仔) (2001-7-26 17:17:38) 得0分 
哎呀,問錯了,前後物件相反了;-(
忙昏了的結果…………

另外,TO 樓上的:
轉換是可以的
struct tm *tblock;
SYSTEMTIME SystemTime;
memset(&SystemTime,0,sizeof(SYSTEMTIME));
tblock=localtime(&timer);
SystemTime.wYear=tblock->tm_year+1900;
SystemTime.wMonth=tblock->tm_mon+1;
SystemTime.wDay=tblock->tm_mday;
SystemTime.wHour=tblock->tm_hour;
SystemTime.wMinute=tblock->tm_min;
SystemTime.wSecond=tblock->tm_sec;
SystemTime.wDayOfWeek=tblock->tm_wday;
return &SystemTime; 
回覆人: zjh73(大章魚) (2001-7-26 20:28:28) 得0分 
有兩種方法:
1、用CTime類
先用time_t型別構造一個CTime物件,再定義一個SYSTEMTIME結構,最後用CTime類的成員函式GetAsSystemTime將時間轉換到SYSTEMTIME結構中
即可。
2、用gmtime函式
gmtime函式將time_t時間轉換到tm結構中並返回一個tm指標,再將tm結構的相對應的項賦給SYSTEMTIME相對應的項即可,不過用這種方法要注
意這兩種結構在天、星期等方面的記數方法有點區別,一個一般從0開始,一個一般從1開始,賦值時要注意校正,還有要注意的是SYSTEMTIME
結構中有一項是毫秒,而time_t是以秒記數的。 
回覆人: zjh73(大章魚) (2001-7-26 20:32:13) 得0分 
反過來也可以用Ctime類的方法
就是先用SYSTEMTIME結構構造一個CTime物件,在用CTime類中的成員函式GetTime返回一個對應的time_t即可。 36。我現在正在學習SDK程式設計,遇到的問題是:
我定義了一個靜態長整形變數,
static long lScore=0;
我想把視窗的標題換成長整形數值,用SetWindowText函式來實現,
由於它的第二個引數要求資料型別為 unsigned short *,但用其來實現強制轉換時
總是出現編譯錯誤:
cannot convert parameter 2 from 'unsigned short *' to 'const char *'
後來改成來LPCTSTR 來實現強制轉換,沒有出現編譯錯誤,但函式總是執行不成功,
請教各位高人,這倒底是怎麼回事???

回覆貼子: 
回覆人: prog_st(st) (2001-8-4 21:20:07) 得0分 
/* ITOA.C: This program converts integers of various
* sizes to strings in various radixes.
*/

#include <stdlib.h>
#include <stdio.h>

void main( void )
{
char buffer[20];
int i = 3445;
long l = -344115L;
unsigned long ul = 1234567890UL;

_itoa( i, buffer, 10 );
printf( "String of integer %d (radix 10): %s\n", i, buffer );
_itoa( i, buffer, 16 );
printf( "String of integer %d (radix 16): 0x%s\n", i, buffer );
_itoa( i, buffer, 2 );
printf( "String of integer %d (radix 2): %s\n", i, buffer );

_ltoa( l, buffer, 16 );
printf( "String of long int %ld (radix 16): 0x%s\n", l, 
buffer );

_ultoa( ul, buffer, 16 );
printf( "String of unsigned long %lu (radix 16): 0x%s\n", ul,
buffer );
}


Output

String of integer 3445 (radix 10): 3445
String of integer 3445 (radix 16): 0xd75
String of integer 3445 (radix 2): 110101110101
String of long int -344115 (radix 16): 0xfffabfcd
String of unsigned long 1234567890 (radix 16): 0x499602d2


回覆人: lwg7603(刑滿釋放人員) (2001-8-4 21:36:15) 得0分 
TCHAR str[255]={_T('\0')};
_stprintf(str,_T("%d"),lScore);
SetWindowText(hwnd,str);

37。我用socket傳送的的buf中間需要的是 char *型別的資料,我想將一個 struct 直接轉換成 char * 發過去。
我用
struct ABCD *abcd;
char *buf;
abcd = (ABCD *)calloc(1,sizeof(ABCD));
buf = (char *)calloc(1,sizeof(ABCD));
///
給abcd 中間賦值,其中有多個char[]的值和int 的值
///
memcpy(buf,abcd,sizeof(ABCD));
//strcpy(buf,(char *)abcd);也不可以
sock(host,buf,....);
//sock(host,(char *)buf,...);也不可以
問題就是在這裡,這個buf中間的值總是不對,大家知道為什麼否。

回覆人: wolf721() (2001-7-30 18:18:34) 得5分 
你傳的是個指標值,而不是資料 
回覆人: kiko_lee(到處瞧瞧) (2001-7-30 18:50:49) 得0分 
但是用memcpy這個是將整個資料都複製過去 
回覆人: lz_0618(lz_0618) (2001-7-30 19:26:44) 得5分 
你用的VC???改成ABCD *abcd;後編譯一點問題也沒有啊!
sock(host,buf,....);這不知是什麼,自定義函式?

typedef struct _ABCD
{
int ID;
char Name[10];
}ABCD;

.......


ABCD *abcd;
char *buf;
abcd = (ABCD *)calloc(2,sizeof(ABCD));
buf = (char *)calloc(2,sizeof(ABCD));
///
//給abcd 中間賦值,其中有多個char[]的值和int 的值
abcd[0].ID =1;
abcd[1].ID =2;
///
memcpy(buf,abcd,2*sizeof(ABCD));
strcpy(buf,(char *)abcd);//也不可以

buf中的內容也正確!!

回覆人: kiko_lee(到處瞧瞧) (2001-7-31 8:57:52) 得0分 
我按照樓上的兄弟說的,做了一下,但是仍然做不下來,我用
memcpy(buf,abcd,sizeof(ABCD));
中間的abcd,不知道是不是地址的問題。 
回覆人: supersusheng(小蘇) (2001-7-31 14:30:42) 得0分 
老大,你sizeof()得出的數值事多大,看看吧。 
回覆人: ydogg(灰毛兔) (2001-7-31 14:41:52) 得0分 
只能傳遞流資料,結構是傳遞不過去的。 
回覆人: IamNotMan(NorGirl) (2001-7-31 14:50:53) 得5分 
我常這麼用
ABCD a ;
//給a的各個域賦值(一定不能含有指標項)
char* buff = new char[sizeof(ABCD)];
memcpy(buff,&a,sizeof(ABCD));
//或者 *(ABCD*)buff = a;
.................
如果buff裡的數對,說明問題不在這兒吧

回覆人: zb_china(最後一座水車zb_china新浪) (2001-7-31 15:16:24) 得0分 
看不明白 
回覆人: eggplant(拉拉) (2001-7-31 15:42:48) 得0分 
最好使用memcpy(),因為struct中的值有可能包含零位元組,所以strcpy()可能不對,如果傳遞struct,最好把struct的位元組對齊改為以位元組為單位。 
回覆人: lvfengxun(lfx) (2001-7-31 16:06:57) 得5分 
直接將結構指標作為send的引數發就可以了,還用轉換什麼
有必要在這裡討論嗎?
struct AA
{
int a;
char b[100];
};
struct AA aa;
aa.a=11;
strcpy(aa.b,"aaa");
send(hSocket,(char *)(&aa),sizeof(aa),0);
//OK 
回覆人: mydewang(mydewang) (2001-7-31 16:33:21) 得0分 
其實這裡是一個位元組對齊的問題,
比如
struct AA
{
int a;
char b;
};
那麼sizeof( struct AA )就不等於5了,而是8了,所以,將這個結構賦值給一個char *,裡面會多出一些零...

需要解決這個問題,可以在Project->Setting->Link->Project Options里加上/Zp1

另外,可以參考一下MSDN裡/Zp的編譯選項..... 
回覆人: lz_0618(lz_0618) (2001-7-31 19:43:54) 得0分 
根本不是什麼位元組對齊的問題,我上面的程式經過測試都好用啊,這位老兄用我的那段程式究竟是什麼錯誤,能說清楚點嗎???

我這邊用socket傳送結構是一點問題也沒有啊,而且是在VC和Delphi編的程式間通訊,當然,這時應該注意位元組對齊的問題了,在VC程式間,
只要不是故意將伺服器和客戶端的編譯環境設的不一樣,肯定是沒有什麼問題的,最多是多傳幾個Bit罷了。 
回覆人: kiko_lee(到處瞧瞧) (2001-8-3 11:02:51) 得0分 
我發現將char * memcpy 到 char * 中間都有點問題,但是如果放到 char []中間就可以了,大家知道為什麼否? 
回覆人: ydogg(灰毛兔) (2001-8-3 11:40:35) 得0分 
memcpy不copy最後的'\0'... 
回覆人: wenjunlin2000(微軟剋星) (2001-8-3 14:32:17) 得0分 
是你看錯了
因為char*是以0 結尾的

回覆人: mc_music(狂沙) (2001-8-3 15:07:21) 得0分 
請注意我的程式:
struct ABCD *abcd;
char *buf;
abcd = (ABCD *)calloc(1,sizeof(ABCD));
//初始化abcd
buf=abcd;//指標直接符值就可以了 
回覆人: zhangnanonnet(WinSockZhang) (2001-8-3 16:21:03) 得0分 
你試試把型別變為BYTE 
回覆人: kiko_lee(到處瞧瞧) (2001-8-7 9:21:08) 得0分 
不管了,給分,大家都有不少的建議呢。


38。double dou=12.34;我如何可以得到char * ch="12.34";轉換函式是什麼?

回覆人: wyzegg(蛋) (2001-7-24 21:26:04) 得50分 
double dou=12.34;
char * ch;
ch=malloc(100);
sprintf(ch,"%5.2f",dou); 
回覆人: wyzegg(蛋) (2001-7-24 21:28:24) 得0分 
或者
#include <stdlib.h>
#include <stdio.h>

void main( void )
{
int decimal, sign;
char *buffer;
int precision = 10;
double source = 3.1415926535;

buffer = _ecvt( source, precision, &decimal, &sign );
printf( "source: %2.10f buffer: '%s' decimal: %d sign: %d\n",
source, buffer, decimal, sign );
}

但是第一種常用 
回覆人: Matrix_w(學會一點點) (2001-7-24 21:32:43) 得30分 
int decimal, sign;
double dou =12.34;
char* ch;
ch = _ecvt(dou,4,&decimal,&sign);

回覆人: imhua(華弟) (2001-7-24 21:35:02) 得20分 
double dou=12.34;
char *str;
gcvt(dou,5,str); //5是長度
MessageBox(str); 
回覆人: Matrix_w(學會一點點) (2001-7-24 21:37:58) 得0分 
/* _GCVT.C: This program converts -3.1415e5
* to its string representation.
*/

#include <stdlib.h>
#include <stdio.h>

void main( void )

相關文章