ID3D12Device::CreateSharedHandle 方法 (d3d12.h)

创建堆、资源或围栏对象的共享句柄。

语法

HRESULT CreateSharedHandle(
  [in]           ID3D12DeviceChild         *pObject,
  [in, optional] const SECURITY_ATTRIBUTES *pAttributes,
                 DWORD                     Access,
  [in, optional] LPCWSTR                   Name,
  [out]          HANDLE                    *pHandle
);

参数

[in] pObject

类型: ID3D12DeviceChild*

指向 ID3D12DeviceChild 接口的指针,该接口表示要为共享而创建的堆、资源或围栏对象。 支持从 ID3D12DeviceChild) 派生 (以下接口:

[in, optional] pAttributes

类型: const SECURITY_ATTRIBUTES*

指向 SECURITY_ATTRIBUTES 结构的指针,该结构包含两个独立但相关的数据成员:一个可选的安全描述符和一个 布尔 值,用于确定子进程是否可以继承返回的句柄。

如果希望应用程序可能创建的子进程不继承 CreateSharedHandle 返回的句柄,并且希望与返回的句柄关联的资源获取默认安全描述符,请将此参数设置为 NULL

结构的 lpSecurityDescriptor 成员指定 资源的SECURITY_DESCRIPTOR 。 如果希望运行时将默认安全描述符分配给与返回的句柄关联的资源,请将此成员设置为 NULL 。 资源的默认安全描述符中的 ACL 来自创建者的主令牌或模拟令牌。 有关详细信息,请参阅 同步对象安全性和访问权限

Access

类型: DWORD

目前,此参数接受的唯一值是GENERIC_ALL。

[in, optional] Name

类型: LPCWSTR

一个 以 NULL 结尾的 UNICODE 字符串,其中包含要与共享堆关联的名称。 名称限制为MAX_PATH个字符。 名称比较区分大小写。

如果 Name 与现有资源的名称匹配, 则 CreateSharedHandle 将失败并 出现DXGI_ERROR_NAME_ALREADY_EXISTS。 发生这种情况的原因是这些对象共享相同的命名空间。

名称可以具有“Global”或“Local”前缀,以在全局命名空间或会话命名空间中显式创建对象。 名称的其余部分可以包含除反斜杠字符 (\) 以外的任何字符。 有关详细信息,请参阅 内核对象命名空间。 使用终端服务会话实现快速用户切换。 内核对象名称必须遵循终端服务概述的准则,以便应用程序可以支持多个用户。

可以在专用命名空间中创建 对象。 有关详细信息,请参阅 对象命名空间

[out] pHandle

类型: 句柄*

指向变量的指针,该变量接收要共享的资源的 NT HANDLE 值。 可以在调用中使用此句柄来访问资源。

返回值

类型: HRESULT

如果成功,则返回S_OK;否则,返回以下值之一:

  • 如果 其中一个参数无效,DXGI_ERROR_INVALID_CALL。
  • DXGI_ERROR_NAME_ALREADY_EXISTS 提供的资源名称是否已与其他资源相关联。
  • E_ACCESSDENIED对象是否在受保护的命名空间中创建。
  • 如果没有足够的内存来创建句柄,E_OUTOFMEMORY。
  • 可能是 Direct3D 12 返回代码 主题中所述的其他错误代码。

备注

可以共享堆和提交的资源。 共享已提交的资源会共享隐式堆以及提交的资源说明,以便可从另一台设备将兼容的资源说明映射到堆。

对于 Direct3D 11 和 Direct3D 12 互操作方案,使用 ID3D11Device5::OpenSharedFence 方法在 DirectX 11 中打开共享围栏,并使用 ID3D11Device::OpenSharedResource1 方法打开共享资源。

对于 Direct3D 12,共享句柄使用 ID3D12Device::OpenSharedHandle 或 ID3D12Device::OpenSharedHandleByName 方法打开。

要求

   
目标平台 Windows
标头 d3d12.h
Library D3D12.lib
DLL D3D12.dll

请参阅

ID3D12Device