青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 126,  comments - 73,  trackbacks - 0

一、TCHAR,LPTSTR,LPCTSTR:定義于WinNT.h

//
// Neutral ANSI/UNICODE types and macros
//
#ifdef UNICODE // r_winnt
#ifndef _TCHAR_DEFINED
typedef WCHAR TCHAR, *PTCHAR;
typedef WCHAR TBYTE , *PTBYTE ;
#define _TCHAR_DEFINED
#endif /* !_TCHAR_DEFINED */
typedef LPWSTR LPTCH, PTCH;
typedef LPWSTR PTSTR, LPTSTR;
typedef LPCWSTR PCTSTR, LPCTSTR;
typedef LPUWSTR PUTSTR, LPUTSTR;
typedef LPCUWSTR PCUTSTR, LPCUTSTR;
typedef LPWSTR LP;
#define __TEXT(quote) L##quote????? // r_winnt
#else?? /* UNICODE */?????????????? // r_winnt
#ifndef _TCHAR_DEFINED
typedef char TCHAR, *PTCHAR;
typedef unsigned char TBYTE , *PTBYTE ;
#define _TCHAR_DEFINED
#endif /* !_TCHAR_DEFINED */
typedef LPSTR LPTCH, PTCH;
typedef LPSTR PTSTR, LPTSTR, PUTSTR, LPUTSTR;
typedef LPCSTR PCTSTR, LPCTSTR, PCUTSTR, LPCUTSTR;
#define __TEXT(quote) quote???????? // r_winnt
#endif /* UNICODE */??????????????? // r_winnt

類似的定義出現于Wtypes.h:


typedef char CHAR;
typedef /* [string] */ CHAR *LPSTR;
typedef /* [string] */ const CHAR *LPCSTR;
#ifndef _WCHAR_DEFINED
#define _WCHAR_DEFINED
typedef wchar_t WCHAR;
typedef WCHAR TCHAR;
#endif // !_WCHAR_DEFINED
typedef /* [string] */ WCHAR *LPWSTR;
typedef /* [string] */ TCHAR *LPTSTR;
typedef /* [string] */ const WCHAR *LPCWSTR;
typedef /* [string] */ const TCHAR *LPCTSTR;


注意在TCHAR.h, WinNT.h中都定義了TCHAR,它們是靠#ifdef _TCHAR_DEFINED來判斷的。在VC6.0中:

#include <WINNT.h>只在WINDEF.H中出現過。
#include <windef.h>出現在 Windows.h中。
#include <windef.h>、#include <TCHAR.h>出現在ATL/INCLUDE/ATLBASE.H中

TCHAR.h中重新定義了標準C庫的很多字符串處理函數的宏,只要在工程中定義或取消UNICODE和_UNICODE,就可以在多字節字符串和UNICODE間互相轉換。按Win32編程要求的"Think In UNICODE",TCHAR.h中的函數應該是經常用到的。

二、BSTR(BASIC String):定義于WTypes.h

#if defined(_WIN32) && !defined(OLE2ANSI)
??? typedef WCHAR OLECHAR;
??? typedef /* [string] */ OLECHAR *LPOLESTR;
??? typedef /* [string] */ const OLECHAR *LPCOLESTR;
#?? define OLESTR(str) L##str
#else
??? typedef char????? OLECHAR;
??? typedef LPSTR???? LPOLESTR;
??? typedef LPCSTR??? LPCOLESTR;
#?? define OLESTR(str) str
#endif
typedef /* [wire_marshal] */ OLECHAR *BSTR;


可以看到,BSTR實際上還是一個C-style的寬字符串(如果定義了OLE2ANSI,就是C字符串了,但很少用到,因為在OLE接口中傳遞時都是寬字符串),只不過在使用BSTR時,得用到特殊的申請/釋放函數組。因為BSTR指針位置前面有一個四字節的數據,存儲的是BSTR的長度。就是這個原因,我們不能把OLECHAR*當作BSTR來用,而編譯器在遇到這種方式時還不報錯!

在MFC程序中不用BSTR時,可以在stdafx.h中所有#include之前加一行:
#define _AFX_NO_BSTR_SUPPORT

在ATL對象的接口定義中,無論是雙接口還是自定義接口,我們一般看不到TCHAR等定義,我們看到的是BSTR(雙接口時的VARIANT,如果是BSTR類型,可以直接用BSTR的),這要求我們作一些處理。對于傳入的參數,一般的做法是將參數賦給一個串處理類。對于傳出的參數,一般的方法是內部先處理,最后將字符串復制一份傳出去。

三、CComBSTR

CComBSTR是ATL庫中的一個BSTR封裝類,提供了一些簡單的函數,支持各類字符串到BSTR的轉換,但沒有格式化、搜索、子串處理等基本功能。功能太過簡單使得這個類可以說是一個雞脅,只能作一個轉換工具用。奇怪的是在Visaul .NET 2003版本中還是沒什么大的改進,我本以為M$會把CString的所有功能都搬進去的。

在M$的《用 CComBSTR 進行編程》提到了一些使用CComBSTR時要注意的一些問題。

四、_bstr_t

_bstr_t是一個與ATL無關的COM的支持類,這個類定義在comutil.h文件中(同時還定義有一個_variant_t類)。這個類也是一個功能與CComBSTR類似,主要用于轉換是,也是一個功能不怎么強的類。

在comutil.h還定義了兩個函數用于在標準C字符串與BSTR間的轉換,可以說這是個底層函數。程序員對TCHAR作一次分解就可以寫出TCHAR適用的程序了。

namespace _com_util {
??? // Convert char * to BSTR
??? //
??? BSTR __stdcall ConvertStringToBSTR(const char* pSrc) ;
??? // Convert BSTR to char *
?? //
?? char* __stdcall ConvertBSTRToString(BSTR pSrc) ;
}

五、CString/CStringA/CStringW

CString在VC6.0以前是MFC的一個類,要想在COM中使用,就得加上那個900K的MFC42.DLL。可能是MFC下的CString太好用了(:p,不要打我),所以M$干脆把這個類搬到ATL中。在Visual C++.NET中CStringT(在CStringT.h中實現)成為ATL的一個模板方式的類,只是將以前在MFC中的方法搬了過來;而CString定義在afxstr.h中:

// MFC-enabled compilation. Use MFC memory management and exceptions;
// also, use MFC module state.
// Don't import when MFC dll is being built
#if !defined(_WIN64) && defined(_AFXDLL)
#if defined(_MFC_DLL_BLD)
template class ATL::CSimpleStringT< char, true >;
template class ATL::CStringT< char, StrTraitMFC_DLL< char > >;
template class ATL::CSimpleStringT< wchar_t, true >;
template class ATL::CStringT< wchar_t, StrTraitMFC_DLL< wchar_t > >;
#else
template class __declspec(dllimport) ATL::CSimpleStringT< char, true >;
template class __declspec(dllimport) ATL::CStringT< char, StrTraitMFC_DLL< char > >;
template class __declspec(dllimport) ATL::CSimpleStringT< wchar_t, true >;
template class __declspec(dllimport) ATL::CStringT< wchar_t, StrTraitMFC_DLL< wchar_t > >;
#if defined(_NATIVE_WCHAR_T)
template class __declspec(dllimport) ATL::CSimpleStringT< unsigned short, true >;
template class __declspec(dllimport) ATL::CStringT< unsigned short, StrTraitMFC_DLL< unsigned short > >;
#endif // _NATIVE_WCHAR_T
#endif // _MFC_DLL_BLD
typedef ATL::CStringT< wchar_t, StrTraitMFC_DLL< wchar_t > > CStringW;
typedef ATL::CStringT< char, StrTraitMFC_DLL< char > > CStringA;
typedef ATL::CStringT< TCHAR, StrTraitMFC_DLL< TCHAR > > CString;
#else
typedef ATL::CStringT< wchar_t, StrTraitMFC< wchar_t > > CStringW;
typedef ATL::CStringT< char, StrTraitMFC< char > > CStringA;
typedef ATL::CStringT< TCHAR, StrTraitMFC< TCHAR > > CString;
#endif // !_WIN64 && _AFXDLL


關于ATL7.0中CString的用法,在M$的《自 Visual C++ 6.0 以來 ATL 7.0 和 MFC 7.0 中的重大更改》中有提到:從 BSTR 轉換到 CString

在 Visual C++ 6.0 中,使用下面的代碼是可以接受的:

BSTR bstr = SysAllocString(L"Hello");
CString str = bstr;
SysFreeString(bstr);對于 Visual C++ .NET 下的新項目,這將在 ANSI 版本下導致下面的錯誤error C2440: 'initializing' : cannot convert from 'BSTR' to
'ATL::CStringT<BaseType,StringTraits>'
現在有 CString 的 UNICODE 和 ANSI 版本(CStringW 和 CStringA)。若要標記任何由隱式轉換導致的不必要的系統開銷,采用反向類型(如帶 UNICODE 參數的 CStringA,或者帶 ANSI 參數的 CStringW)的構造函數現在在 stdafx.h 中被使用下面的項標記為顯式的:

#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS

若要避免此錯誤,請執行下列操作之一:

使用 CStringW 以避免轉換:
???
BSTR bstr = SysAllocString(L"Hello");
??? CStringW str = bstr;
??? SysFreeString(bstr);

顯式調用該構造函數:
??? BSTR bstr = SysAllocString(L"Hello");
??? CString str = CString(bstr);
??? SysFreeString(bstr);

從 stdafx.h 中移除 #define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS 行。


在VC6.0及以前,很多程序員都做過將MFC中的CString,這種在網上很多。我看到的一個很完整的是gosh的gd::CString,網址是
http://www.codeproject.com/soap/serialize_xml.asp 。據這位老兄自己說,他自己還沒有VC 6.0編譯器。

六、std::string和std::wstring

std::string在我看來是std::vector<char>。但這個類可以說是一個有史以來計算機程序員對字符串處理類的一個總結,它的算法應該是沒得說的。

七、字符串(類)間的轉換

以上各類字符串間的轉換從概念上有兩種方式,第一種是已經有的轉換接口,另一種是基于某一個中間格式作轉換,其實第一種實現也是基于第二種的。

char 與 wchar_t 間的轉換:
簡單地說,是兩個Win32函數:WideCharToMultiByte和MultiByteToWideChar。當然中間還涉及到代碼頁和線程代碼頁等參數。如果用標準C函數wctomb和mbtowc也可以。

在M$的《自Visual C++6.0以來ATL7.0和MFC7.0中的重大更改》中有提到:字符串轉換

Visual C++ 6.0 中 ATL 3.0 和 ATL 3.0 以前的 ATL 版本中,使用 atlconv.h 中的宏的字符串轉換始終是使用系統 (CP_ACP) 的 ANSI 代碼頁執行的。從 Visual C++ .NET 中的 ATL 7.0 開始,字符串轉換將使用當前線程的默認 ANSI 代碼頁執行,除非定義了 _CONVERSION_DONT_USE_THREAD_LOCALE(此情況下,如以前一樣使用系統的 ANSI 代碼頁)。

請注意,字符串轉換類(如 CW2AEX)使您得以將用于轉換的代碼頁傳遞給它們的構造函數。如果未指定代碼頁,這些類使用與宏相同的代碼頁。

有關更多信息,請參見 ATL 和 MFC 字符串轉換宏。

COM程序中,接口一般都是BSTR,所以無論在編寫COM組件時還是使用組件時,轉為BSTR和從BSTR轉出都可能遇到。如果全部采用UNICODE,麻煩要少一些,如果使用到了char或std::string,麻煩就不少了。但一般而言,我們有以下方法可以用:

在接口(組件)內部,全部用UNICODE處理。將傳入的BSTR轉換為std::wstring、gd:CString或是其它的什么類,在內部成員變量聲明時用同樣的類,內部處理時不用管外面,生成結果時用一個CComBST或是_bstr_t類作一次轉換就可以了。

在接口外部,調用COM組件的接口函數前,將字符串用_bstr_t或者comutil.h的函數作一個轉換,傳入組件進行處理;傳出時,作一個反向的轉換。

非COM程序中,接口一般用TCHAR*,這種方式的代價最小。



Trackback: http://tb.donews.net/TrackBack.aspx?PostId=245116

posted on 2009-12-07 17:43 我風 閱讀(2029) 評論(0)  編輯 收藏 引用

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


<2010年5月>
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345

常用鏈接

留言簿(12)

隨筆分類

隨筆檔案

文章檔案

相冊

收藏夾

C++

MyFavorite

搜索

  •  

積分與排名

  • 積分 - 329316
  • 排名 - 76

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲人成网站999久久久综合| 国产手机视频一区二区| 亚洲精品孕妇| 亚洲女人天堂成人av在线| 在线播放亚洲一区| 亚洲一区美女视频在线观看免费| 在线观看中文字幕不卡| 亚洲一区免费观看| 亚洲日本中文字幕区| 欧美怡红院视频一区二区三区| 亚洲精品久久久久久久久久久久| 亚洲综合色激情五月| 久久国产欧美精品| 久久只有精品| 国产欧美日韩不卡| 一区二区三区黄色| 亚洲日本中文| 久久免费视频观看| 欧美自拍丝袜亚洲| 国产精品美女www爽爽爽| 亚洲美女在线观看| 亚洲看片网站| 欧美精品v国产精品v日韩精品| 久久理论片午夜琪琪电影网| 国产精品一区一区| 亚洲欧美日韩一区二区| 香蕉久久夜色精品国产使用方法 | 久久精品盗摄| 国产精品一区二区三区久久| 一本色道久久88精品综合| 99riav久久精品riav| 欧美电影电视剧在线观看| 欧美成人午夜激情视频| 亚洲国产精品一区二区久| 久久一二三四| 亚洲福利免费| 99综合电影在线视频| 欧美日韩精选| 亚洲一区二区在线播放| 午夜亚洲视频| 国产午夜精品视频免费不卡69堂| 午夜精品在线观看| 久久国产精品电影| 激情久久中文字幕| 欧美成人激情视频免费观看| 亚洲国产精品一区二区尤物区| 亚洲二区视频| 欧美精品一区二区三区在线播放| 亚洲三级免费电影| 亚洲欧美第一页| 国产偷国产偷精品高清尤物| 久久国产精品久久w女人spa| 欧美www视频| 夜夜嗨av一区二区三区中文字幕| 欧美日韩亚洲在线| 亚洲女人天堂av| 亚洲国产精品va在线看黑人| 影音先锋日韩精品| 欧美韩国日本综合| 亚洲自拍啪啪| 欧美国产日本| 亚洲欧美在线免费| 狠狠色狠狠色综合日日小说| 欧美成人精精品一区二区频| 亚洲一二三区在线观看| 麻豆freexxxx性91精品| 99国产欧美久久久精品| 国产精品一区二区欧美| 噜噜噜噜噜久久久久久91 | 亚洲一级网站| 久久综合图片| 日韩一级欧洲| 激情综合激情| 欧美调教视频| 久久久久在线观看| 亚洲亚洲精品三区日韩精品在线视频| 久热精品视频在线| 亚洲一区二区少妇| 亚洲激情偷拍| 国产综合色一区二区三区| 欧美成人免费小视频| 亚洲一区欧美二区| 亚洲黄色在线看| 亚洲天堂免费在线观看视频| 韩国av一区二区| 欧美黑人在线观看| 久久久久久久久久久成人| 亚洲人成网在线播放| 农村妇女精品| 欧美一区成人| 亚洲一区二区三| 亚洲靠逼com| 国产日韩欧美中文在线播放| 欧美日韩国产色站一区二区三区| 欧美一区二区在线播放| 日韩午夜视频在线观看| 欧美国产一区二区在线观看| 亚洲欧美日韩国产综合| 一区二区激情| 99精品国产在热久久| 亚洲国产欧美精品| 狠狠色综合网站久久久久久久| 国产精品久久久久久久午夜| 欧美国产成人精品| 久久免费观看视频| 久久黄金**| 欧美一区二区三区视频在线 | 欧美视频网址| 欧美精品97| 欧美乱妇高清无乱码| 欧美激情中文字幕乱码免费| 欧美成人免费全部观看天天性色| 久久不射网站| 久久精品日韩| 久久久亚洲人| 男人的天堂成人在线| 久久免费一区| 免费国产一区二区| 欧美a级一区二区| 久久免费国产精品| 欧美a级理论片| 欧美日韩国产色视频| 欧美日韩中文字幕综合视频 | 久久一区欧美| 欧美高清视频在线观看| 欧美xx视频| 欧美风情在线观看| 欧美久久久久中文字幕| 欧美日韩国产精品一区| 欧美人成在线视频| 欧美日韩精品免费观看| 欧美国产先锋| 国产精品mm| 国产亚洲欧美在线| 亚洲东热激情| 一区二区三区|亚洲午夜| 亚洲专区一区| 久久精品国产欧美激情| 久热精品在线| 亚洲欧洲精品天堂一级| 一区二区三区视频在线看| 亚洲在线免费视频| 久久国产成人| 欧美日韩国产电影| 国内精品久久久久久| 国产一区在线视频| 亚洲人在线视频| 午夜欧美不卡精品aaaaa| 久久国产欧美| 亚洲第一区中文99精品| 99视频精品| 欧美日韩国产区| 欧美日韩免费区域视频在线观看| 国产精品久久二区| 亚洲高清色综合| 亚洲欧美日韩精品综合在线观看| 久久成人资源| 亚洲激情成人网| 欧美在线免费观看视频| 欧美电影专区| 国产一区二区三区不卡在线观看| 亚洲精品视频免费观看| 久久精品天堂| 亚洲精品视频在线观看网站| 亚洲综合欧美| 欧美电影免费观看大全| 国产亚洲二区| 亚洲一区二区精品在线| 免费日韩成人| 欧美一级久久久| 欧美日本亚洲| 亚洲人成7777| 久久综合久久综合这里只有精品 | 亚洲第一免费播放区| 亚洲自拍偷拍网址| 欧美欧美天天天天操| 国产视频久久网| 亚洲综合色在线| 日韩视频一区二区三区在线播放免费观看| 亚洲一本视频| 亚洲精品1区| 毛片一区二区| 激情综合视频| 久久久午夜精品| 欧美一区二区在线免费播放| 欧美视频在线免费看| 亚洲久久一区二区| 欧美高清视频在线观看| 久久精品国产清自在天天线| 国产精品视频男人的天堂| 亚洲视频中文字幕| 日韩一级免费| 欧美日韩天堂| 亚洲精品一区二区三区樱花| 久久免费精品日本久久中文字幕| 亚洲一二三区精品| 国产精品亚洲综合久久| 欧美一级网站| 欧美中文字幕精品| 激情亚洲成人|