《Windows核心程式設計》讀書筆記 四

2021-03-31 08:56:32 字數 2648 閱讀 7016

第二章 unicode

windows 中的unicode

windows標頭檔案定義了幾種關於unicode的資料型別:

wchar    unicode字元

pwstr    指向unicode字串的指標

pcwstr   指向乙個恆定的unicode字串的指標

同時windows標頭檔案也定業了ansi/unicode的通用資料型別,ptstr和pctstr,這類資料指向那一種字元,取決於當編譯程式模組時是否定義了unicode巨集。這裡這個巨集unicode沒有下劃線字首,帶字首的巨集_unicode用於c執行期標頭檔案。當編譯源**模組時,通常必須同時定義這兩個巨集。

windows中的函式creatwindow***有兩個版本,乙個是接受unicode字串的,為creatwindow***w;乙個接受ansi字串的,為creatwindow***a。我們在**中,通常只包括了對creatwindow***的呼叫,而不是直接呼叫這兩者,因為在winuser.h檔案中,creatwindow***實際上是定義為乙個巨集。故編譯源**模組時,呼叫的是哪creatwindow***版本,取決於你是否已作了unicode的定義。

若要建立供其它開發人員使用的dll,dll中最好提供兩個輸出函式,乙個ansi版本,乙個unicode版本,在ansi版本中,只需要分配記憶體,執行必要的字串轉換,然後呼叫該函式的unicode版本即可。

windows的一些老函式存在乙個大問題,它們不接受unicode字串。這時候應該避免使用這些函式。所有新的和未過時的函式在windows2000中都同時擁有ansi和unicode兩個版本。

windows字串函式

windows提供了一組範圍很廣的字串操作函式,它們是作業系統的乙個組成部分,常常被大型應用程式所使用。由於這些函式使用得比較多,故在你的應用程式執行時,它們可能被裝進ram,所以呼叫它們而不是使用c執行期庫,會有助於稍稍提高你的執行效能。要使用經典的作業系統函式樣式中的操作字串的函式,必須加上shlwapi.h標頭檔案。這些字串函式,既有ansi版,也有unicode版本,因此,當建立應用程式時,如果定義了unicode,那麼它們會自動擴充套件為寬字元版本。

成為符合ansi和unicode的應用程式

要使你的應用程式符合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)。在上面所說的所有原則中,這是最難記住的一條原則,如果操作錯誤,編譯器將不發出任何警告。

windwos提供了如下一組對unicode字串進行操作的函式:

lstrcat    將乙個字串置於另乙個字串的結尾處

lstrcmp    對兩個字串進行區分大小寫的比較

lstrcmpi   對兩個字串進行不區分大小寫的比較

lstrcpy    將乙個字串拷貝到記憶體中的另外乙個位置

lstrlen    返回字串的長度

這些函式都是作為巨集來實現的,即是說它們可作為unicode/ansi的通用版本,會根據是否定義了unicode而自動擴充套件。

windows提供了兩個函式,以便轉換unicode字串的大小寫字母:

ptstr charlower(ptstr pszstring);

ptstr charupper(ptstr pszstring);

既可以轉換單個字元,也可以轉換以0結尾的整個字串。若要轉換整個字串,只需要傳遞字串的位址即可。若要轉換單個字元,則必須像下面這樣傳遞各個字元:

tchar clowercasechar = charlower(ptstr) szstring[0];

將單個字元轉換成乙個ptstr,便可呼叫該函式,將乙個值傳遞給它,在這個值中,較低的16位包含了該字元,較高的16位包含0。當該函式看到較高位是0時,該函式就知道你想要轉換單個字元,而不是整個字串。返回的值是個32位值,較低的16位中是已經轉換的字元。

當資源編譯器對你的所有資源進行編譯時,輸出檔案是資源的二進位制檔案。資源(字串表、對話方塊模板和選單等)中的字串值總是寫unicode字串。

windows用istextunicode函式來區分所開啟文字是ansi字元還unicode字元。

dword istextunicode(const pvoid pvbuffer , int cb , pint presult);

文字檔案存在的問題是,它們的內容沒有嚴格和明確的規則,因此很難確定該檔案是包含ansi字元還是unicode字元。istextunicode使用一系列統計方法和定性方法,以便猜測快取的內容。由於這不是一種確切的科學方法,因此istextunicode有可能返回不正確的結果。

2023年11月11日

讀書筆記 Windows核心程式設計

第二章 從windows nt後,windows所有版本都用unicode來構建。如果輸入乙個非unicom的字串,如ansi,函式會將其先轉換為unicode,再把結果傳回作業系統,這樣經過轉換後,需要更多的記憶體,而且執行速度更慢。並且,目前已知的windows的這些轉換函式存在一些bug。所有...

《Windows核心程式設計》讀書筆記(一)

第1章對程式錯誤的處理 1 常見的windows函式的返回型別 void 無返回值型,該函式的執行不可能失敗。windows函式很少此型別 bool 函式執行失敗則返回0,否則返回非0 handle 失敗則返回null,否則返回乙個可操作的物件的handle。注 有些函式會返回乙個控制代碼值inva...

《Windows核心程式設計》讀書筆記(三)

unicode 寬位元組字符集是是為了解決軟體本地化 多語言版本化 而定製的一項技術標準。unicode字串中的所有字元都是16位的 兩個位元組 程式設計師只需要對指標進行遞增或者遞減,就可以遍歷字串中的各個字元,不在需要像單位元組字元一樣去判斷下一位元組是屬於同一字元的組成部分還是乙個新字元。使用...