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):
[in, optional] pAttributes
类型:常 SECURITY_ATTRIBUTES*
指向包含两个独立但相关数据成员的 SECURITY_ATTRIBUTES 结构的指针:可选的安全描述符,以及一个 布尔值,该值确定子进程是否可以继承返回的句柄。
如果希望应用程序可能创建的子进程不继承 createSharedHandle返回的句柄,并且希望与返回的句柄关联的资源获取默认安全描述符,请将此参数设置为
结构的 lpSecurityDescriptor 成员指定资源的 SECURITY_DESCRIPTOR。 如果希望运行时向与返回的句柄关联的资源分配默认安全描述符,请将此成员设置为 NULL。 资源的默认安全描述符中的 ACL 来自创建者的主令牌或模拟令牌。 有关详细信息,请参阅 同步对象安全和访问权限。
Access
类型:DWORD
目前,此参数接受的唯一值是GENERIC_ALL。
[in, optional] Name
类型:LPCWSTR
NULL-terminated UNICODE 字符串,其中包含要与共享堆关联的名称。 名称限制为MAX_PATH个字符。 名称比较区分大小写。
如果 名称 与现有资源的名称匹配,CreateSharedHandle 失败并出现 DXGI_ERROR_NAME_ALREADY_EXISTS。 之所以发生这种情况,是因为这些对象共享相同的命名空间。
该名称可以具有“全局”或“本地”前缀,以在全局或会话命名空间中显式创建对象。 名称的其余部分可以包含除反斜杠字符(\)以外的任何字符。 有关详细信息,请参阅 内核对象命名空间。 快速用户切换是使用终端服务会话实现的。 内核对象名称必须遵循终端服务概述的准则,以便应用程序能够支持多个用户。
可以在专用命名空间中创建对象。 有关详细信息,请参阅 对象命名空间。
[out] pHandle
类型:HANDLE*
指向接收要共享的资源的 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 方法打开共享句柄。
要求
要求 | 价值 |
---|---|
目标平台 | 窗户 |
标头 | d3d12.h |
库 | D3D12.lib |
DLL | D3D12.dll |