句柄
指導(dǎo)書上出現(xiàn)了一個(gè)陌生的名詞“句柄(handle)”媳瞪,感覺(jué)比較奇妙因谎,因?yàn)樵谥熬帉懳⑿殴娞?hào)小程序看教程也編寫了一個(gè)handle程序亏推。所以留檔一下吧。
句柄(handle)叁巨,有多種意義斑匪,其中第一種是指程序設(shè)計(jì),第二種是指Windows編程》嫔祝現(xiàn)在大部分都是指程序設(shè)計(jì)/程序開(kāi)發(fā)這類蚀瘸。
第一種解釋:句柄是一種特殊的智能指針 。當(dāng)一個(gè)應(yīng)用程序要引用其他系統(tǒng)(如數(shù)據(jù)庫(kù)庶橱、操作系統(tǒng))所管理的內(nèi)存塊或?qū)ο髸r(shí)苍姜,就要使用句柄。
第二種解釋:整個(gè)Windows編程的基礎(chǔ)悬包。一個(gè)句柄是指使用的一個(gè)唯一的整數(shù)值,即一個(gè)4字節(jié)(64位程序中為8字節(jié))長(zhǎng)的數(shù)值馍乙,來(lái)標(biāo)識(shí)應(yīng)用程序中的不同對(duì)象和同類中的不同的實(shí)例布近,諸如垫释,一個(gè)窗口,按鈕撑瞧,圖標(biāo)棵譬,滾動(dòng)條,輸出設(shè)備预伺,控件或者文件等订咸。應(yīng)用程序能夠通過(guò)句柄訪問(wèn)相應(yīng)的對(duì)象的信息,但是句柄不是指針酬诀,程序不能利用句柄來(lái)直接閱讀文件中的信息脏嚷。如果句柄不在I/O文件中,它是毫無(wú)用處的瞒御。 句柄是Windows用來(lái)標(biāo)志應(yīng)用程序中建立的或是使用的唯一整數(shù)父叙,Windows大量使用了句柄來(lái)標(biāo)識(shí)對(duì)象。
實(shí)驗(yàn)一中相關(guān)函數(shù)解釋
參考MSDN 中的幫助文件 CreateMutex() 肴裙、 OpenMutex() 趾唱、 ReleaseMutex() 和WaitForSingleObject()的使用方法,理解父子進(jìn)程如何利用互斥體進(jìn)行同步的蜻懦。給出父子進(jìn)程同步過(guò)程的一個(gè)大概描述甜癞。
-
CreateMutex()
CreateMutex()函數(shù)可用來(lái)創(chuàng)建一個(gè)有名或無(wú)名的互斥量對(duì)象,其函數(shù)原型為
HANDLE CreateMutex(
LPSECURITY_ATTRIBUTESlpMutexAttributes, // 指向安全屬性的指針
BOOLbInitialOwner, // 初始化互斥對(duì)象的所有者
LPCTSTRlpName // 指向互斥對(duì)象名的指針
);
-
OpenMutex()
OpenMutex函數(shù)為現(xiàn)有的一個(gè)已命名互斥體對(duì)象創(chuàng)建一個(gè)新句柄,函數(shù)原型:
HANDLE OpenMutex(
DWORD dwDesiredAccess, // access
BOOL bInheritHandle, // inheritance option
LPCTSTR lpName // object name
);
-
ReleaseMutex()
ReleaseMutex是一種線性指令宛乃,具有釋放線程擁有的互斥體的控制權(quán),函數(shù)原型為:
BOOL WINAPI ReleaseMutex(
HANDLE hMutex //hMutex:HANDLE悠咱,制定一個(gè)互斥體的句柄。
);
-
WaitForSingleObject()
當(dāng)?shù)却栽?a target="_blank" rel="nofollow">掛起狀態(tài)時(shí)烤惊,句柄被關(guān)閉乔煞,那么函數(shù)行為是未定義的。該句柄必須具有 SYNCHRONIZE 訪問(wèn)權(quán)限柒室。函數(shù)原型:
DWORD WINAPI WaitForSingleObject(
__in HANDLE hHandle,
__in DWORD dwMilliseconds
);
參數(shù)說(shuō)明:hHandle[in]對(duì)象句柄渡贾。可以指定一系列的對(duì)象雄右,如Event空骚、Job、Memory resource notification擂仍、Mutex囤屹、Process、Semaphore逢渔、Thread肋坚、Waitable timer等。
dwMilliseconds[in]定時(shí)時(shí)間間隔,單位為milliseconds(毫秒).如果指定一個(gè)非零值智厌,函數(shù)處于等待狀態(tài)直到hHandle標(biāo)記的對(duì)象被觸發(fā)诲泌,或者時(shí)間到了。如果dwMilliseconds為0铣鹏,對(duì)象沒(méi)有被觸發(fā)信號(hào)敷扫,函數(shù)不會(huì)進(jìn)入一個(gè)等待狀態(tài),它總是立即返回诚卸。如果dwMilliseconds為INFINITE葵第,對(duì)象被觸發(fā)信號(hào)后,函數(shù)才會(huì)返回合溺。