MFC基本內容

來源:互聯網
上載者:User

一、_T()函數

 

_T("")是一個宏,他的作用是讓你的程式支援Unicode編碼
因為Windows使用兩種字元集ANSI和UNICODE,
前者就是通常使用的單位元組方式,
但這種方式處理象中文這樣的雙位元組字元不方便,
容易出現半個漢字的情況。
而後者是雙位元組方式,方便處理雙位元組字元。

Windows NT的所有與字元有關的函數都提供兩種方式的版本,而Windows 9x只支援ANSI方式。
如果你編譯一個程式為ANSI方式,
_T實際不起任何作用。
而如果編譯一個程式為UNICODE方式,則編譯器會把"Hello"字串以UNICODE方式儲存。_T和_L的區別在於,_L不管你是以什麼方式編譯,一律以UNICODE方式儲存。
 

LPSTR:32bit指標指向一個字串,每個字元佔1位元組

LPCSTR:32-bit指標指向一個常字串,每個字元佔1位元組
LPCTSTR:32-bit指標指向一個常字串,每字元可能佔1位元組或2位元組,取決於Unicode是否定義
LPTSTR:32-bit指標每字元可能佔1位元組或2位元組,取決於Unicode是否定義

 

L是表示字串資源為Unicode的。

比如
wchar_t Str[] = L"Hello World!";
這個就是雙子節儲存字元了。

_T是一個適配的宏~


#ifdef _UNICODE的時候
_T就是L
沒有#ifdef _UNICODE的時候
_T就是ANSI的。

比如

LPTSTR lpStr = new TCHAR[32];
TCHAR* szBuf = _T("Hello");
以上兩句使得無論是在UNICODE編譯條件下都是正確編譯的。

而且MS推薦你使用相匹配的字串函數。
比如處理LPTSTR或者LPCTSTR 的時候,不要用strlen ,而是要用_tcslen

否則在UNICODE的編譯條件下,strlen不能處理 wchar_t*的字串。

T是非常有意思的一個符號(TCHAR、LPCTSTR、LPTSTR、_T()、_TEXT()...),它表示使用一種中間類型,既不明確表示使用 MBCS,也不明確表示使用 UNICODE。那到底使用哪種字元集?編譯的時候才決定

 

將char字串轉換成Unicode字串。
T是個宏,不是函數

在需要雙位元組的函數,或COM裡需要雙位元組的串.
為了國際相容。其實很簡單。
Visual C++裡邊定義字串的時候,用_T來保證相容性,VC支援ascii和unicode兩種字元類型,用_T可以保證從ascii編碼類別型轉換到unicode編碼類別型的時候,程式不需要修改。

如果將來你不打算升級到unicode,那麼也不需要_T,

_t("hello world")
在ansi的環境下,它是ansi的,如果在unicode下,那麼它將自動解釋為雙位元組字元串,既unicode編碼。
這樣做的好處,不管是ansi環境,還是unicode環境,都適用。

2\請問在vc++中的字串_T("ABC")和一個普通的字串“ABC”有什麼區別。

_T("ABC")
表示如果定義了unicode
它表示 L"ABC",每個字元為16位,寬字元字串
---------------------------------------------------------
if not UNICODE
它就是ascii的"ABC",每個字元為8位
"ABC"就是指ascii字串"ABC"

----------------------------------------------------------

相當於
#ifdef _UNICODE
#define _T("ABC") L"ABC"
#else
#define _T("ABC") "ABC"
#endif

----------------------------------------------------------

_T("ABC")中的一個字元和漢字一樣,佔兩個位元組,而在"ABC"中,英文字元佔一個位元組,漢字佔兩個位元組

 

 

二、堆和棧

     

1、“堆”和“棧”在C++中主要是指存放資料或者說是變數、對象的在記憶體中的地區,如同現實中
美國和中國的區別,表面上是在記憶體中的位置不同,但是分配記憶體的方式卻大不相同,如同美國和中國雖然表面上都是國家,但是社會制度、各種福利
各種機構都不同,一句話就是記憶體中的不同地區。

2、c++中“堆”:在一個程式中
堆是一片記憶體,不是有堆記憶體之說,一般都是程式員手動分配,在C++中則是一般用new操作符(如果不使用C的malloc系列,好像只能用new)分配
的記憶體,同樣也只能程式員手動釋放,不然會有記憶體泄露。當然了給什麼分配記憶體,那隻能給變數、類對象分配,所以存放的也是類對象和變數。
c++中“棧”:是程式自動分配的記憶體,比如調用某個函數,傳遞參數時(值傳遞),那麼這個參數的值是在“棧”記憶體上分配的,當這個函數退出後 佔用的“棧”記憶體也就自己釋放了。

 

三、Windows Socket

 

s Socket的實現方法:
          
Socket是串連應用程式與網路驅動程式的橋樑。它在應用程式中建立,通過綁定操作與驅動程式建立關係。此後,應用程式送給Socket資料,由
Socket交給驅動程式,驅動程式再把資料向網路上發送出去。電腦從網路上收到與該Socket綁定的IP地址和連接埠號碼相關的資料後,由驅動程式交給
Socket,應用程式便可從該Socket中提取接收到的資料。網路應用程式就是這樣運用Socket進行資料的發送與接收的。

ISO/OSI七層參考模型(ISO:國際標準組織   OSI:Open System Interconnection):
物理層:提供二進位傳輸,確定在通訊通道上如何傳輸位元流。
資料連結層:提供介質訪問,加強物理層的傳輸功能,建立一條無差錯的傳輸線路。
網路層:提供IP定址和路由。因為在網路上資料可以經由多條線路到達目的地,網路層負責找出最佳的傳輸路線。        
傳輸層:為源端主機到目的端主機提供可靠的Data Transmission Service,隔離網路的上下層協議,使得網路應用與下層協議無關。
會話層:在兩個相互連信的應用進程之間建立、組織和協調其相互之間的通訊。     
展示層:處理被傳送資料的表示問題,即資訊的文法和語義。  

對等層通訊的實質:
對等層實體之間虛擬通訊。
下層向上層提供服務,實際通訊在最底層完成。

各層所使用的協議:
應用程式層:遠程登入協議Telnet、檔案傳輸通訊協定FTP、超文字傳輸通訊協定 (HTTP)HTTP、網域名稱服務 (DNS)DNS、簡易郵件傳輸通訊協定SMTP、郵局協議POP3。
傳輸層:傳輸控制通訊協定TCP、使用者資料包通訊協定UDP。
網路層:網際協議IP、Internet互連網控制報文協議ICMP、Internet組管理協議IGMP。

TCP/IP模型:應用程式層、傳輸層、網路層、網路介面層。
TCP/IP模型與OSI模型對照如下
 應用程式層:應用程式層、展示層、會話層。      傳輸層:傳輸層。     網路層:網路層。   網路介面層:資料連結層、物理層。

連接埠:一種抽象的軟體結構(包括一些資料結構和I/O緩衝區)。

通訊端的類型:
(1)流式通訊端(SOCK_STREAM),基於TCP協議實現。
(2)資料通訊端(SOCK_DGRAM),UDP協議實現。
(3)原始通訊端(SOCK_RAW)

Windows Socket  “TCP”網路編程執行個體
一些開發步驟:
“TCP”伺服器端
1、載入通訊端庫。
2、建立通訊端。
3、綁定地址資訊。
4、綁定通訊端。
5、監聽通訊端。
6、“Accept”等待使用者請求。
7、“send”發送資料。
8、"recv"接收資料。
9、關閉“使用中的通訊端”,繼續迴圈等待。

“TCP”用戶端
1、載入通訊端庫。
2、建立通訊端。
3、綁定地址資訊。
4、綁定通訊端。
5、發出請求。
6、接收資料。
7、發送資料。
8、關閉通訊端。
9、“WSACleanup”終止“通訊端庫”的使用。(伺服器端一直迴圈運行,所有沒有)。

對於UDP通訊,不需要建立串連,直接進行收/發就可以了。

 

 

四、多線程

     

1、程式和進程
        
程式是電腦指令的集合,它以檔案的形式儲存在磁碟上。而進程是正在啟動並執行程式的執行個體。比如,我們編譯產生的“exe”檔案是一個可執行程式,儲存在磁碟
上就是程式。點擊運行後,就啟動了該程式的一個執行個體,我們稱之為進程。一個程式可以有多個進程,也就是一個程式可以產生多個執行個體。

2、進程和線程
         進程從來不執行任何東西,它是線程的容器,真正完成代碼執行的是線程。單個進程可能包含若干個線程,但至少包含一個主線程。

3、進程的地址空間
         系統賦予每個進程獨立的虛擬位址空間。對於32位作業系統,運行32位的進程,這個地址空間是4G。因為對於32位指標來說,它的定址的範圍是2的32次方,即4G。這就是為什麼32位作業系統,記憶體條一般不超過4G的原因。

4、虛擬記憶體。
        在磁碟上有一個“pagefile.sys”檔案,它是頁檔案,頁檔案透明的為應用程式增加了記憶體,這一部分就是虛擬記憶體。

5、線程。
        線程的核心對象:作業系統用來存放線程統計資訊的小型的資料結構。
        線程棧:它用於維護線程在執行代碼是所需要的所有函數參數和局部變數。
        同一個進程的不同線程運行在同一個進程環境下,它們共用資源,所以可以非常容易的實現相互之間的通訊。
        線程運行在作業系統為其分配的CPU時間片上,對於單核CPU,就要多個線程來回切換。多核CPU就可以實現多個線程的並發執行。
        採用多線程而不是多進程,是因為線程只有一個核心對象和一個棧,佔用記憶體少。而對於進程每一個都要分配4GB的虛擬位址空間,佔用資源多。而且進程切換需要交換整個地址空間。線程之間的切換隻是執行環境的改變。

       這些都是些基本的知識,希望您也能複習下。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.