次の方法で共有


IDXGIResource1::CreateSharedHandle メソッド (dxgi1_2.h)

共有リソースへのハンドルを作成します。 その後、返されたハンドルを複数の Direct3D デバイスで使用できます。

構文

HRESULT CreateSharedHandle(
  [in, optional] const SECURITY_ATTRIBUTES *pAttributes,
  [in]           DWORD                     dwAccess,
  [in, optional] LPCWSTR                   lpName,
  [out]          HANDLE                    *pHandle
);

パラメーター

[in, optional] pAttributes

2 つの独立した関連データ メンバー (省略可能なセキュリティ記述子と、子プロセスが返されたハンドルを継承できるかどうかを決定するブール値) を含む SECURITY_ATTRIBUTES 構造体へのポインター。

アプリケーションが作成する子プロセスが CreateSharedHandleによって返されるハンドルを継承しないようにする場合、および返されたハンドルに関連付けられているリソースで既定のセキュリティ記述子を取得する場合は、このパラメーターを null 設定します。

構造体の lpSecurityDescriptor メンバーは、リソースの SECURITY_DESCRIPTOR を指定します。 ランタイムが返されたハンドルに関連付けられているリソースに既定のセキュリティ記述子を割り当てる場合は、このメンバーを NULL に設定します。 リソースの既定のセキュリティ記述子の ACL は、作成者のプライマリ トークンまたは偽装トークンから取得されます。 詳細については、「同期オブジェクトのセキュリティとアクセス権のを する」を参照してください。

[in] dwAccess

リソースに対して要求されたアクセス権。 DXGI では、汎用アクセス権に加えて、次の値を定義します。

  • DXGI_SHARED_RESOURCE_READ ( 0x80000000L ) - リソースへの読み取りアクセスを指定します。
  • DXGI_SHARED_RESOURCE_WRITE ( 1 ) - リソースへの書き込みアクセスを指定します。
ビットごとの OR 演算を使用して、これらの値を組み合わせることができます。

[in, optional] lpName

共有するリソースの名前。 名前はMAX_PATH文字に制限されています。 名前の比較では大文字と小文字が区別されます。

ID3D11Device1::OpenSharedResourceByName メソッドを呼び出して共有リソースに名前でアクセスする場合は、リソース名が必要です。 代わりに、ID3D11Device1::OpenSharedResource1 メソッドを呼び出してハンドルによって共有リソースにアクセスする場合は、このパラメーターを NULL設定します。

lpName が既存のリソースの名前と一致する場合、CreateSharedHandle DXGI_ERROR_NAME_ALREADY_EXISTSで失敗します。 これは、これらのオブジェクトが同じ名前空間を共有しているために発生します。

名前には、グローバル名前空間またはセッション名前空間にオブジェクトを明示的に作成するための "Global" または "Local" プレフィックスを付けることができます。 名前の残りの部分には、円記号 (\) を除く任意の文字を含めることができます。 詳細については、「カーネル オブジェクト名前空間を参照してください。 高速ユーザー切り替えは、ターミナル サービス セッションを使用して実装されます。 カーネル オブジェクト名は、アプリケーションが複数のユーザーをサポートできるように、ターミナル サービスに関して概説されているガイドラインに従う必要があります。

オブジェクトはプライベート名前空間に作成できます。 詳細については、「オブジェクト名前空間の」を参照してください。

[out] pHandle

共有するリソースに NT HANDLE 値を受け取る変数へのポインター。 このハンドルは、リソースにアクセスするための呼び出しで使用できます。

戻り値

成功した場合はS_OKを返します。それ以外の場合は、次のいずれかの値を返します。

  • いずれかのパラメーターが無効な場合に DXGI_ERROR_INVALID_CALL します。
  • 共有するリソースの指定された名前が既に別のリソースに関連付けられている場合は、DXGI_ERROR_NAME_ALREADY_EXISTS します。
  • オブジェクトが保護された名前空間に作成されているかどうかをE_ACCESSDENIEDします。
  • ハンドルを作成するのに十分なメモリが使用できない場合にE_OUTOFMEMORYします。
  • DXGI_ERROR トピックで説明されているその他のエラー コードが考えられます。
Windows 7 用プラットフォーム更新プログラム: Platform Update for Windows 7 がインストールされている Windows 7 または Windows Server 2008 R2 で 、CreateSharedHandle E_NOTIMPLで失敗します。 Windows 7 のプラットフォーム更新プログラムの詳細については、「Windows 7 用プラットフォーム更新プログラム」を参照してください。

備考

CreateSharedHandle は、リソースを共有として作成し、NT ハンドルを使用するように指定した場合にのみ NT ハンドルを返します (つまり、D3D11_RESOURCE_MISC_SHARED_NTHANDLE フラグと D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX フラグを設定します)。 リソースを共有として作成し、NT ハンドルを使用するように指定した場合は、CreateSharedHandle 使用して共有用のハンドルを取得する必要があります。 この状況では、IDXGIResource::GetSharedHandle メソッドは失敗するため使用できません。

CreateSharedHandle ID3D11Device1::OpenSharedResource1 メソッドの呼び出しで返されるハンドルを渡して、別のデバイスで作成した共有リソースへのアクセス権をデバイスに付与できます。

CreateSharedHandle 返されるハンドルは NT ハンドルであるため、CloseHandleDuplicateHandleなどと共にハンドルを使用できます。 CreateSharedHandle は、共有リソースに対して 1 回だけ呼び出すことができます。後の呼び出しは失敗します。 同じ共有リソースに対してさらにハンドルが必要な場合は、DuplicateHandle呼び出します。 共有リソース ハンドルが不要になったら、メモリ リークを回避するために、CloseHandle 呼び出してハンドルを閉じます。

リソースを共有するために createSharedHandle 呼び出すときにリソースの名前を lpName 渡す場合は、その後、この名前を ID3D11Device1::OpenSharedResourceByName メソッドの呼び出しで渡して、共有リソースへの別のデバイス アクセス権を付与できます。 名前付きリソースを使用する場合、悪意のあるユーザーは、その前にこの名前付きリソースを使用し、アプリが起動しないようにすることができます。 このような状況を回避するには、ランダムな名前のリソースを作成し、承認されたユーザーのみが取得できるように名前を格納します。 または、この目的でファイルを使用することもできます。 アプリをユーザーごとに 1 つのインスタンスに制限するには、ユーザーのプロファイル ディレクトリにロックされたファイルを作成します。

リソースを共有として作成し、NT ハンドルを使用するように指定しなかった場合、CreateSharedHandle を使用して共有用のハンドルを取得することはできません。これは、CreateSharedHandle 失敗するためです。

ID3D11Texture2D* pTexture2D;
ID3D11Device* pDevice;

pDevice->CreateTexture2D(…, &pTexture2D); // Create the texture as shared with NT HANDLEs.

HANDLE handle;
IDXGIResource1* pResource;
pTexture2D->QueryInterface(__uuidof(IDXGIResource1), (void**) &pResource);
pResource->CreateSharedHandle(NULL, 
         DXGI_SHARED_RESOURCE_READ | DXGI_SHARED_RESOURCE_WRITE, 
         NULL,
         &handle);

// Pass the handle to another process to share the resource.

必要条件

要件 価値
サポートされる最小クライアント Windows 7 用 Windows 8 およびプラットフォーム更新プログラム [デスクトップ アプリ |UWP アプリ]
サポートされる最小サーバー Windows Server 2012 および Windows Server 2008 R2 用プラットフォーム更新プログラム [デスクトップ アプリ |UWP アプリ]
ターゲット プラットフォーム の ウィンドウズ
ヘッダー dxgi1_2.h
ライブラリ Dxgi.lib

関連項目

IDXGIResource1