共用命名物件
本主題說明如何在通用 Windows 平台 (UWP) 應用程式和 Win32 應用程式之間共用具名物件。
封裝應用程式中的具名物件
具名物件可讓您輕鬆地讓處理序共用物件控制代碼。 在處理序建立具名物件之後,其他處理序就可以使用名稱呼叫適當的函式,來開啟物件的控制代碼。 具名物件通常用於執行緒同步處理和處理序間通訊。
根據預設,封裝的應用程式只能存取自己建立的具名物件。 若要與封裝的應用程式共用具名物件,必須在建立物件時設定許可權,而且在開啟物件時必須限定名稱。
建立具名物件
具名物件是使用對應的 Create
API 建立:
所有這些 API 都會共用 LPSECURITY_ATTRIBUTES
參數,讓呼叫端能夠指定存取控制清單 (ACL) 來控制哪些處理序可以存取該物件。 若要與封裝的應用程式共用具名物件,建立具名物件時,必須在 ACL 內授與許可權。
安全性識別碼 (SID) 代表 ACL 內的身分識別。 每個封裝的應用程式都有自己的 SID,並以其套件系列名稱為基礎。 您可以將封裝應用程式系列名稱傳遞至 DeriveAppContainerSidFromAppContainerName,來產生已封裝應用程式的 SID。
注意
要找到套件系列名稱,在開發期間可透過 Visual Studio 中的套件資訊清單編輯器找到,對於透過 Microsoft Store 發佈的應用程式可透過合作夥伴中心找到,對於已安裝的應用程式可透過 Get-AppxPackage PowerShell 命令找到。
這個範例展示了 ACL 具名物件所需的基本模式。 若要與已封裝的應用程式共用具名物件,請為每個應用程式建立 EXPLICIT_ACCESS 結構:
grfAccessMode = GRANT_ACCESS
grfAccessPermissions =
以物件和預定使用方式為依據的適當許可權grfInheritance = NO_INHERITANCE
Trustee.TrusteeForm = TRUSTEE_IS_SID
Trustee.TrusteeType = TRUSTEE_IS_USER
Trustee.ptstrName =
從 DeriveAppContainerSidFromAppContainerName 取得的 SID
藉由在 Create
呼叫中填入已封裝應用程式 EXPLICIT_ACCESS
規則中的 LPSECURITY_ATTRIBUTES
參數,您可以授與這些應用程式存取權,來開啟具名物件。
注意
只要 Win32 應用程式在開啟物件時符合物件名稱,就可以存取封裝應用程式所建立的所有具名物件。 不需要授與存取權。
開啟具名物件
具名物件會藉由將名稱傳遞至對應的 Open
API 來開啟:
封裝應用程式所建立的具名物件,是在應用程式的命名空間內建立,它也稱為具名物件路徑。 開啟封裝應用程式所建立的具名物件時,物件名稱前面必須加上建立應用程式的具名物件路徑。
GetAppContainerNamedObjectPath 會根據其 SID 傳回已封裝應用程式的具名物件路徑。 您可以將封裝應用程式系列名稱傳遞至 DeriveAppContainerSidFromAppContainerName,來產生已封裝應用程式的 SID。
注意
要找到套件系列名稱,在開發期間可透過 Visual Studio 中的套件資訊清單編輯器找到,對於透過 Microsoft Store 發佈的應用程式可透過合作夥伴中心找到,對於已安裝的應用程式可透過 Get-AppxPackage PowerShell 命令找到。
開啟封裝應用程式所建立的具名物件時,請使用格式 <PATH>\<NAME>
:
- 將
<PATH>
取代為建立應用程式的具名物件路徑。 - 將
<NAME>
取代為物件名稱。
注意
只有在物件是由已封裝的應用程式所建立時,才需要為物件名稱加上前置詞 <PATH>
。 Win32 應用程式所建立的具名物件不需要限定,不過建立物件時仍必須授與存取權。
備註
封裝應用程式中的具名物件預設會隔離,以保留安全性,並確保支援暫停和終止等應用程式生命週期事件。 跨應用程式共用具名物件會帶來嚴格的繫結和版本控制條件約束,並要求每個應用程式都能調適其他應用程式的生命週期。 基於這些理由,建議只在同一個發行者的應用程式之間共用具名物件。