筆記摘錄 Unicode 核心物件

2021-09-27 08:10:11 字數 3502 閱讀 3941

第一章   對程式錯誤的處理

1、若要確定是什麼錯誤,請呼叫getlasterror函式:該函式從執行緒區域性儲存區獲取32位錯誤**。

2、visual studio還配有乙個小的實用程式稱為error lookup,可以使用error lookup將錯誤**的號碼轉換成相應文字描述。

3、windows提供了乙個函式formatmessage,可以將錯誤**轉換成它的文字描述。error lookup呼叫formatmessage函式。

4、watch(監視)視窗中選擇一行輸入$err,hr,它始終顯示上乙個錯誤**和其文字描述。

5、setlasterror設定執行緒的上乙個錯誤**。

第二章   unicode

1、軟體的本地化要解決的真正問題,實際上就是如何來處理不同的字符集。

2、有些文字和書寫規則的字符集中的符號太多了,因此單位元組(提供的符號最多不能超過256個)是根本不夠的,為此出現了雙位元組字符集(字串中的每個字元可以包含乙個位元組或兩個位元組)。strlen函式可獲得字串中究竟有多少位元組而不能獲得有多少字元。 

3、unicode:寬位元組字符集,字串中的所有字元都是16位的(兩個位元組),因此總共可以得到 65000個字元,遠遠超過了單位元組字符集的256個字元的數目。可以很容易地在不同語言之間進行資料交換 ,提高應用程式的執行效率 。

5、char:8位ansi字元(char)    wchar_t:16位的unicode字元(wchar)。 unicode資料型別:wchar (unicode字元)、pwstr(指向unicode字串的指標)、pcwstr(指向乙個恆定的unicode字串的指標)。

6、tchar資料型別可以定義乙個ansi/unicode通用的字串陣列,如果定義了_unicode:typedef wchar_t tchar;   未定義_unicode:typedef char tchar。 ansi/unicode通用資料型別:ptstr和pctstr,取決於是否定義巨集unicode。

7、字串前面的大寫字母l或_t(),用於告訴編譯器該字串應該作為unicode字串來編譯。

8、unicode函式均以wcs開頭,用字首wcs來取代ansi字串函式的字首str,如wcscpy = strcpy。 ansi/unicode通用字串函式:lstrcat、lstrcmp、lstrcmpi、lstrcpy、lstrlen,取決於是否定義unicode巨集。

9、函式名末尾的w表明該函式接受unicode字串,a表明接受ansi字串,如

createwindowexa、createwindowexw

10、成為符合ansi和unicode的應用程式基本原則 :

* 將文字串視為字元陣列,而不是chars陣列或位元組陣列;

* 將通用資料型別(如tchar和ptstr)用於文字字元和字串;

* 將顯式資料型別(如byte和pbyte)用於位元組、位元組指標和資料快取;

* 將text巨集用於原義字元和字串;

* 執行全域性性替換(例如用ptstr替換pstr);

* 傳遞乙個快取的大小: sizeof(szbuffer)/sizeof(tchar),  為字串按位元組來分配記憶體塊: malloc(ncharacters *sizeof(tchar));

*使用字尾為_s的安全字串處理函式

第三章   核心物件

1、每個核心物件只是核心分配的乙個記憶體塊,並且只能由該核心訪問。該記憶體塊是一種資料結構,它的成員負責維護該物件的各種資訊。

2、應用程式如何才能操作這些核心物件呢?

當呼叫乙個用於建立核心物件的函式時,該函式就返回乙個用於標識該物件的控制代碼。程序中的任何執行緒都可以使用這個控制代碼值,將控制代碼傳遞給windows的各個函式,系統就能知道你想操作哪個核心物件。

3、每個核心物件都包含乙個資料成員:使用計數。當乙個物件剛剛建立時,它的使用計數被置為1。當另乙個程序訪問乙個現有的核心物件時,使用計數就遞增1。如果核心物件的使用計數降為0,核心就撤消該物件(程序終止執行,核心物件不一定被撤消)。

4、安全描述符用於描述誰建立了該物件,誰能夠訪問或使用該物件,誰無權訪問該物件。用於建立核心物件的函式幾乎都有乙個指向security_attributes結構的指標作為其引數,大多數應用程式只是為該引數傳遞null,建立帶有預設安全性的核心物件。

5、應用程式也可使用其他型別的物件,如選單、視窗、滑鼠游標、

刷子和字型等。這些物件屬於使用者物件或圖形裝置介面gdi物件。

如何確定乙個物件是否屬於核心對

象? 

觀察建立該物件所用的函式,建立核心物件的所有函式都有乙個設定安全屬性的引數。用於建立使用者物件或gdi物件的函式都沒有psecurity_ attributes引數。

6、當程序初次被初始化時,系統為它分配乙個空的控制代碼表。當程序中的執行緒呼叫建立核心物件的函式時,核心就為該物件分配乙個記憶體塊,並對它初始化,同時核心掃瞄程序的控制代碼表,找出乙個空項放入。建立核心物件的函式返回與程序相關的控制代碼,該控制代碼值實際上是放入程序的控制代碼表中的索引。如果呼叫函式建立核心物件失敗,返回的控制代碼值是null(0),呼叫createfile時未能開啟指定的檔案,返回值是invalid_handle_value(-1)。

7、通過呼叫closehandle來關閉核心物件,該函式首先檢查呼叫程序的控制代碼表,如果傳遞給它的索引(控制代碼)是有效的,那麼系統就可以獲得核心物件的資料結構的位址,並可確定該結構中的使用計數。如果使用計數是0,該核心便從記憶體中撤消該核心物件。

8、closehandle(hfile),關閉控制代碼後,只是建立的控制代碼表記錄項被清除,不能再次訪問,但是該變數儲存的值還存在,所以應將hfile = null。

9、在不同程序中執行的執行緒需要共享核心物件,需要共享的原因:

1)檔案對映物件使你能夠在同一臺機器上執行的兩個程序之間共享資料塊。

2)郵箱和指定的管道使得應用程式能夠在連網的不同機器上執行的程序之間傳送資料塊。

3)互斥物件、信標和事件使得不同程序中的執行緒能夠同步它們的連續執行,這與乙個應用程式在完成某項任務時需要將情況通知另乙個應用程式的情況相同。

10、共享跨越程序邊界的核心物件的三種方法:

物件控制代碼的繼承性:若要建立能繼承的控制代碼,父程序必須指定乙個security_attributes結構,並對它初始化時將binherithandle成員置為true,然後將該結構的位址傳遞給特定的create函式。

給物件命名:a程序呼叫create*函式引數pszname為null時,就向系統指明建立乙個匿名核心物件,若要按名字共享物件,則為pszname引數傳遞乙個以0結尾的字串名字的位址。b程序可通過呼叫create*函式或open*函

數共享物件。 

使用duplicatehandle函式:該函式取出乙個程序的控制代碼表中的專案,並將該專案拷貝到另乙個程序的控制代碼表中。

《Windows核心程式設計》筆記1 核心物件

由於.net framework中很多地方需要用到以前win32中的一些知識點,不了解其中的來朧去脈學習起來會比較吃力,於是準備用點時間補一下windows 核心方面的知識點,參考書本是經典的核心物件是核心分配的乙個記憶體塊,這種記憶體塊是乙個資料結構,表示核心物件的各種特徵。並且只能由核心來訪問。...

Windows核心程式設計筆記 (3)核心物件

每個核心物件都只是乙個記憶體塊,它由作業系統核心分配,並只能由作業系統核心訪問,這個記憶體塊是乙個資料結構,其成員維護著於物件相關的資訊。少數成員是所有物件都有的,像安全描述符和使用計數等 大多數成員是特有的,像程序物件的程序id,檔案物件的位元組偏移量。由於核心物件的資料結構只能由作業系統核心訪問...

核心物件 Windows核心學習筆記

物件,是乙個特殊的資料結構,用來定義受保護得實體,我們平時所說得物件實際上是物件體,例如程序物件,就是eprocess。所以核心物件不能直接被使用者層進行操作,那我們只能通過控制代碼。控制代碼是乙個指向物件得指標。物件具有唯一性,但是控制代碼可以有多個,也就是說乙個物件可以有多個控制代碼來引用它,對...