このトピックでは、ユニバーサル Windows プラットフォーム (UWP) アプリケーションと Win32 アプリケーションの間で名前付きオブジェクトを共有する方法について説明します。
パッケージ アプリケーション内の名前付きオブジェクト
名前付きオブジェクト は、プロセスがオブジェクト ハンドルを共有するための簡単な方法を提供します。 プロセスが名前付きオブジェクトを作成した後、他のプロセスは名前を使用して適切な関数を呼び出してオブジェクトのハンドルを開くことができます。 名前付きオブジェクトは、スレッド同期 とプロセス間通信
既定では、パッケージ 化されたアプリケーションは、作成した名前付きオブジェクトにのみアクセスできます。 パッケージ アプリケーションと名前付きオブジェクトを共有するには、オブジェクトの作成時にアクセス許可を設定し、オブジェクトを開くときに名前を修飾する必要があります。
名前付きオブジェクトの作成
名前付きオブジェクトは、対応する Create API を使用して作成されます。
- の CreateEvent
- CreateFileMapping (英語)
- CreateMutex の
- CreateSemaphore の
- CreateWaitableTimer の
これらの API はすべて、 LPSECURITY_ATTRIBUTES パラメーターを共有します。これにより、呼び出し元は アクセス制御リスト (ACL) を 指定して、オブジェクトにアクセスできるプロセスを制御できます。 パッケージ アプリケーションと名前付きオブジェクトを共有するには、名前付きオブジェクトの作成時に ACL 内でアクセス許可を付与する必要があります。
セキュリティ識別子 (SID) は、ACL 内の ID を表します。 パッケージ化されたアプリケーションには、パッケージ ファミリ名に基づいて独自の SID があります。 パッケージ アプリケーションの SID を生成するには、そのパッケージ ファミリ名を DeriveAppContainerSidFromAppContainerName に渡します。
注
パッケージ ファミリ名は、開発時に Visual Studio のパッケージ マニフェスト エディター、Microsoft Store を介して公開されたアプリケーションの パートナー センター 、または既にインストールされているアプリケーションの Get-AppxPackage PowerShell コマンドを使用して確認できます。
このサンプル では、名前付きオブジェクトを ACL するために必要な基本的なパターンを示します。 パッケージ 化されたアプリケーションと名前付きオブジェクトを共有するには、アプリケーションごとに EXPLICIT_ACCESS 構造を構築します。
grfAccessMode = GRANT_ACCESS-
grfAccessPermissions =オブジェクトと使用目的に基づく適切なアクセス許可 grfInheritance = NO_INHERITANCETrustee.TrusteeForm = TRUSTEE_IS_SIDTrustee.TrusteeType = TRUSTEE_IS_USER- DeriveAppContainerSidFromAppContainerName から取得した SID を
Trustee.ptstrName =
パッケージ 化されたアプリケーションのLPSECURITY_ATTRIBUTES規則をCreate呼び出しで EXPLICIT_ACCESS パラメーターに設定することで、それらのアプリケーションにアクセス権を付与して、名前付きオブジェクトを開くことができます。
注
Win32 アプリケーションは、オブジェクト名を指定する限り、パッケージ アプリケーションによって作成されたすべての名前付きオブジェクトにアクセスできます
名前付きオブジェクトを開く
名前付きオブジェクトは、対応する Open API に名前を渡すことによって開かれます。
パッケージ 化されたアプリケーションによって作成された名前付きオブジェクトは、名前付きオブジェクト パスと呼ばれる、アプリケーションの名前空間内に作成されます。 パッケージ 化されたアプリケーションによって作成された名前付きオブジェクトを開く場合、オブジェクト名には、作成するアプリケーションの名前付きオブジェクト パスのプレフィックスを付ける必要があります。
GetAppContainerNamedObjectPath は、SID に基づいてパッケージ 化されたアプリケーションの名前付きオブジェクト パスを返します。 パッケージ アプリケーションの SID を生成するには、そのパッケージ ファミリ名を DeriveAppContainerSidFromAppContainerName に渡します。
注
パッケージ ファミリ名は、開発時に Visual Studio のパッケージ マニフェスト エディター、Microsoft Store を介して公開されたアプリケーションの パートナー センター 、または既にインストールされているアプリケーションの Get-AppxPackage PowerShell コマンドを使用して確認できます。
パッケージ 化されたアプリケーションによって作成された名前付きオブジェクトを開く場合は、 <PATH>\<NAME>形式を使用します。
-
<PATH>を、作成するアプリケーションの名前付きオブジェクト パスに置き換えます。 -
<NAME>をオブジェクト名に置き換えます。
注
オブジェクト名に <PATH> のプレフィックスを付けます。これは、パッケージ 化されたアプリケーションによってオブジェクトが作成された場合にのみ必要です。 Win32 アプリケーションによって作成された名前付きオブジェクトは修飾する必要はありませんが、オブジェクトがに作成
注釈
パッケージ アプリケーションの名前付きオブジェクトは、セキュリティを維持し、中断や終了などのアプリケーション ライフサイクル イベントのサポートを確保するために、既定で分離されます。 アプリケーション間で名前付きオブジェクトを共有すると、厳密なバインドとバージョン管理の制約が生じ、各アプリケーションが他のアプリケーションのライフサイクルに対して回復性を持つ必要があります。 このような理由から、同じ発行元のアプリケーション間でのみ名前付きオブジェクトを共有することをお勧めします。