CreateMutexExW 函式 (synchapi.h)
建立或開啟具名或未命名的 Mutex 物件,並傳回物件的句柄。
語法
HANDLE CreateMutexExW(
[in, optional] LPSECURITY_ATTRIBUTES lpMutexAttributes,
[in, optional] LPCWSTR lpName,
[in] DWORD dwFlags,
[in] DWORD dwDesiredAccess
);
參數
[in, optional] lpMutexAttributes
SECURITY_ATTRIBUTES 結構的指標。 如果此參數 NULL,則子進程無法繼承 mutex 句柄。
lpSecurityDescriptor 結構的成員會指定新 mutex 的安全性描述元。 如果 lpMutexAttributesNULL,mutex 會取得預設的安全性描述元。 Mutex 的預設安全性描述元中的 ACL 來自建立者的主要或模擬令牌。 如需詳細資訊,請參閱 Synchronization Object Security and Access Rights。
[in, optional] lpName
Mutex 物件的名稱。 名稱限制為 MAX_PATH 個字元。 名稱比較區分大小寫。
如果 lpNameNULL,則會建立 mutex 物件,而沒有名稱。
如果 lpName 符合現有事件、旗號、可等候定時器、作業或檔案對應對象的名稱,則函式 會失敗,而且 getLastError 函式會傳回 ERROR_INVALID_HANDLE。 這是因為這些對象共用相同的命名空間。
名稱可以有 「Global」 或 「Local」 前置詞,以明確在全域或會話命名空間中建立物件。 名稱的其餘部分可以包含反斜杠字元 (\) 以外的任何字元。 如需詳細資訊,請參閱 Kernel Object Namespaces。 使用終端機服務會話實作快速使用者切換。 核心物件名稱必須遵循終端機服務概述的指導方針,應用程式才能支援多個使用者。
物件可以在私人命名空間中建立。 如需詳細資訊,請參閱 物件命名空間。
[in] dwFlags
此參數可以是 0 或下列值。
價值 | 意義 |
---|---|
|
物件建立者是 mutex 的初始擁有者。 |
[in] dwDesiredAccess
mutex 物件的存取遮罩。 如需訪問許可權清單,請參閱 Synchronization Object Security and Access Rights。
傳回值
如果函式成功,傳回值就是新建立 Mutex 物件的句柄。
如果函式失敗,則傳回值 NULL。 若要取得擴充的錯誤資訊,請呼叫 GetLastError。
如果 mutex 是具名 mutex,而且此函式呼叫之前存在物件,則傳回值是現有物件的句柄,而 getLastError 函式
言論
如果您使用具名 Mutex 將應用程式限制為單一實例,惡意使用者可以先建立此 Mutex,再執行並防止應用程式啟動。 若要避免這種情況,請建立隨機命名的 mutex 並儲存名稱,以便只能由授權的使用者取得它。 或者,您可以針對此目的使用檔案。 若要將您的應用程式限制為每個使用者一個實例,請在使用者配置檔目錄中建立鎖定的檔案。
呼叫進程的任何線程都可以在呼叫其中一個 等候函式時指定 mutex-object 句柄,。 當指定物件的狀態發出訊號時,單一物件等候函式會傳回。 當任一物件或發出所有指定物件的訊號時,可以指示多物件等候函式傳回。 當等候函式傳回時,等候線程會釋放以繼續執行。
Mutex 物件的狀態會在任何線程未擁有時發出訊號。 建立線程可以使用 dwFlags 參數來要求 mutex 的立即擁有權。 否則,線程必須使用其中一個等候函式來要求擁有權。 當 Mutex 的狀態發出訊號時,會授與一個等候線程擁有權、Mutex 的狀態變更為非信號,而 wait 函式會傳回。 在任何指定時間,只有一個線程可以擁有 Mutex。 擁有線程會使用 ReleaseMutex 函式來釋放其擁有權。
擁有 Mutex 的線程可以在重複的等候函式呼叫中指定相同的 Mutex,而不會封鎖其執行。 一般而言,您不會重複等候相同的 Mutex,但此機制會防止線程在等候已擁有的 Mutex 時自行死結。 不過,若要釋放其擁有權,線程必須在每次 mutex 滿足等候時呼叫 ReleaseMutex 一次。
兩個以上的進程可以呼叫 createMutex ,以建立相同的具名 mutex。 第一個程序實際上會建立 mutex,而具有足夠訪問許可權的後續進程只會開啟現有 Mutex 的句柄。 這可讓多個進程取得相同 Mutex 的句柄,同時減輕使用者確保先啟動建立程式的責任。 使用這項技術時,您不應該使用 CREATE_MUTEX_INITIAL_OWNER 旗標;否則,可能很難確定哪個進程具有初始擁有權。
多個進程可以有相同 Mutex 物件的句柄,讓對象能夠用於進程間同步處理。 下列物件共享機制可供使用:
CreateProcess 函式所建立的子進程,如果lpMutexAttributes CreateMutex 啟用繼承的 參數,就可以繼承 mutex 物件的句柄。 此機制適用於具名和未命名的 Mutex。- 進程可以在呼叫 DuplicateHandle 函式中指定 mutex 物件的句柄,以建立另一個進程可以使用的重複句柄。 此機制適用於具名和未命名的 Mutex。
- 進程可以在呼叫 [OpenMutex](./nf-synchapi-openmutexw.md) 或 CreateMutex 函式中指定具名 mutex,以擷取 mutex 物件的句柄。
注意
synchapi.h 標頭會將 CreateMutexEx 定義為別名,根據 UNICODE 預處理器常數的定義,自動選取此函式的 ANSI 或 Unicode 版本。 混合使用編碼中性別名與非編碼中性的程序代碼,可能會導致編譯或運行時間錯誤不符。 如需詳細資訊,請參閱函式原型的
要求
要求 | 價值 |
---|---|
最低支援的用戶端 | Windows Vista [傳統型應用程式 |UWP 應用程式] |
支援的最低伺服器 | Windows Server 2008 [傳統型應用程式 |UWP 應用程式] |
目標平臺 | 窗戶 |
標頭 | synchapi.h (包括 Windows 7 上的 Windows.h、Windows Server 2008 Windows Server 2008 R2) |
連結庫 | Kernel32.lib |
DLL | Kernel32.dll |