聊一聊枚舉一個(gè)進(jìn)程中的所有線程
在 Win32 開發(fā)中,如果需要獲取程序運(yùn)行過程中的一些較為底層的信息,你可能需要使用到 Tool Helper 庫。但我愿意稱之它為 Win32 中的 “害群之馬”。何解?
Tool Helper 庫在 16 位 Windows 時(shí)代就已經(jīng)存在了,這個(gè)庫主要用來提供一些調(diào)試服務(wù),例如獲取調(diào)用堆棧和枚舉系統(tǒng)中的所有內(nèi)存等。
Win32 的初始版本中,并沒有包含它,直到 Windows 95 之后,32 位版本的 Tool Helper 程序庫才被引入到 Win32 中。
不管我們對它的評價(jià)如何,這些功能仍然存在,所以讓我們試一試看看效果。
運(yùn)行上面的程序,它會(huì)打印系統(tǒng)中所有線程的列表(或至少是你有權(quán)訪問的所有線程)。
代碼的邏輯還是挺簡單的,唯一的微妙之處在于代碼中的一個(gè)奇怪的檢查,即 Thread32First 函數(shù)返回的大小足夠大,可以包含我們需要的 th32OwnerProcessID 字段。這種復(fù)雜性是必要的,因?yàn)?Thread32First 和 Thread32Next 函數(shù)檢查結(jié)構(gòu)大小的方式有些非正統(tǒng)。
當(dāng)一個(gè) API 被認(rèn)為是 Win32 API 的一匹害群之馬時(shí),就會(huì)發(fā)生上面的這種情況。
總結(jié)
一般我們會(huì)將應(yīng)用程序的設(shè)置數(shù)據(jù)保存到注冊表,這很方便,但是記得讀取的時(shí)候,盡量只讀一次并緩存結(jié)果,而不是每次都從注冊表里讀取,這對運(yùn)行時(shí)性能是有傷害的。