windows核心程式設計讀書筆記(一)

2022-08-09 11:00:10 字數 2592 閱讀 9348

第一章:錯誤處理

通過getlasterror函式獲得更多的錯誤資訊,或者在監視框中使用@err,hr(vs2005)獲得錯誤資訊,而不僅僅是錯誤編號。

第二章:字元和字串處理

在應用程式中,應確保要麼同時定義了unicode和_unicode,要麼就乙個都不定義,前者是windows所用,後者是c執行庫所用。

為了程式的安全應該盡量使用加_s字尾的字串處理函式。

使用_s字尾的字串函式後,如果超出緩衝區所允許的空間大小,會將整個字串第乙個字元設為'\0',其他位元組填充0xfd。

stringcchcat,stringcchcopy,stringcchprintf,stringcchprintfex系列函式,在緩衝區太小時會截斷字串,而不是像_s系列函式那樣直接截斷為空字串。

呼叫_crtsetreportmode(_crt_assert,0);後可以禁止可能由c執行時觸發的所有debug assertion failed對話方塊。

使用_countof來獲取字元數,在字串函式的宣告中用cch字首來表示。用sizeof獲取字串的位元組數,在字串函式的宣告中用cb表示。

使用windows函式multibytetowidechar將多位元組字串轉換為寬位元組字串。

multibytetowidechar(

uint     codepage,

dword    dwflags,

lpcstr   lpmultibytestr,

int      cbmultibyte,

lpwstr lpwidecharstr,

int      cchwidechar);

其中ucodepage引數是乙個**頁值,ansi**頁為1252,日文**頁為932,簡體中文**頁為936,950代表正體中文。

dwflags通常是0.

lpmultibytestr指定要轉換的字串,cbmultibyte引數指定字串的長度(位元組數)。如果傳給cbmultibyte引數的值是-1,函式便可自動判斷源字串的長度。

lpwidecharstr指定目標記憶體緩衝區,必須在cchwidechar中指定這個緩衝區的最大長度(字元數)。如果呼叫multibytetowidechar並給cchwidechar引數傳入0,函式就不執行轉換,而是返回乙個寬字元數,包括\0。

通常使用以下步驟將乙個多位元組字串轉換為unicode形式。

1.呼叫multibytetowidechar,lpwidecharstr引數傳入null,cchwidechar引數傳入0,cbmultibyte傳入-1。

2.分配一塊記憶體,它的大小是第一步呼叫的返回值乘以sizeof(wchar_t)。

3.再次呼叫multibytetowidechar,將第二步分配的記憶體位址傳給lpwidecharstr,將第一步呼叫的返回值傳給cchwidechar。

4.使用轉換後的字串。

5.釋放unicode字串占用的記憶體塊。

使用windows函式widechartomultibyte將寬字串轉換為多位元組字串。

函式原型:

int widechartomultibyte(

uintcodepage,

dworddwflags,

lpwstrlpwidecharstr,

intcchwidechar,

lpcstrlpmultibytestr,

intcchmultibyte,

lpcstrlpdefaultchar,

pboolpfuseddefaultchar);

使用方法類似於multibytetowidechar函式,不同點在於最後兩個引數。當函式遇到乙個不在codepage指定的**頁中的文字時,會用 lpdefaultchar指向的字元替換。如果此引數為空,系統會使用預設字元進行替換,通常為問號,對檔名轉換比較危險,因為問號是乙個萬用字元。

pfuseddefaultchar指向乙個布林變數,如果至少有乙個字元不能成功轉換,此布林變數將被設為true,如果所有的都能成功轉換,此變數將為false。

第三章 核心物件

windows的很多東西都是核心物件:訪問令牌物件,事件物件,檔案物件,檔案對映物件,i/o完成埠物件,作業物件,郵件槽(mailslot)物件,互斥量(mutex)物件,管道(pipe)物件,程序物件,執行緒物件,訊號量(semaphore)物件,可等待的計時器物件,執行緒池工廠物件等。

物件基本是通過create開頭的函式建立,通過open系列函式進行程序間的共享,通過closehandle函式關閉使用。

物件內部都有乙個引用計數器,每有乙個程序獲得對此物件的訪問權後,此計數器加一。當某乙個程序終止執行後,此計數器減一。所以,被某一程序所建立的物件,如果在過程中被其他執行緒使用了,其生存期可能會長過建立它的程序。只用當使用計數器變成0時,系統才銷毀此物件。

跨程序共享核心物件的方法:

1.使用物件控制代碼繼承。

2.為物件命名。

3.複製物件控制代碼。

讀書筆記 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位的 兩個位元組 程式設計師只需要對指標進行遞增或者遞減,就可以遍歷字串中的各個字元,不在需要像單位元組字元一樣去判斷下一位元組是屬於同一字元的組成部分還是乙個新字元。使用...