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
包含兩個個別但相關資料成員 之SECURITY_ATTRIBUTES 結構的指標:選擇性的安全性描述元,以及判斷子進程是否可以繼承傳回控制碼的布林值。
如果您想要讓應用程式建立的子進程不繼承CreateSharedHandle所傳回的控制碼,而且您希望與傳回控制碼相關聯的資源取得預設安全性描述項,請將此參數設定為Null。
結構的 lpSecurityDescriptor 成員會指定資源的 SECURITY_DESCRIPTOR 。 如果您想要讓執行時間將預設安全性描述元指派給與傳回控制碼相關聯的資源,請將此成員設定為 Null 。 資源的預設安全性描述元中的 ACL 來自建立者的主要或模擬權杖。 如需詳細資訊,請參閱 同步處理物件安全性和存取權限。
[in] dwAccess
要求的資源存取權限。 除了 泛型存取權限之外,DXGI 還會定義下列值:
- DXGI_SHARED_RESOURCE_READ ( 0x800000000L ) - 指定資源的讀取權限。
- DXGI_SHARED_RESOURCE_WRITE ( 1 ) - 指定資源的寫入權限。
[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 主題中 可能描述的其他錯誤碼。
備註
CreateSharedHandle 只會在您建立資源為共用時傳回 NT 控制碼,並指定它使用 NT 控制碼 (也就是您設定 D3D11_RESOURCE_MISC_SHARED_NTHANDLE 和 D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX 旗標) 。 如果您將資源建立為共用並指定其使用 NT 控制碼,則必須使用 CreateSharedHandle 來取得共用的控制碼。 在此情況下,您無法使用 IDXGIResource::GetSharedHandle 方法,因為它將會失敗。
您可以傳遞 CreateSharedHandle 在呼叫 ID3D11Device1::OpenSharedResource1 方法時傳回的控制碼,讓裝置能夠存取您在不同裝置上建立的共用資源。
因為 CreateSharedHandle 傳回的控制碼是 NT 控制碼,所以您可以使用控制碼搭配 CloseHandle、 DuplicateHandle等等。 您只能針對共用資源呼叫 CreateSharedHandle 一次;稍後的呼叫會失敗。 如果您需要更多相同共用資源的控制碼,請呼叫 DuplicateHandle。 當您不再需要共用資源控制碼時,請呼叫 CloseHandle 以關閉控制碼,以避免記憶體流失。
如果您在呼叫CreateSharedHandle來共用資源時將資源的名稱傳遞至lpName,您接著可以在呼叫ID3D11Device1::OpenSharedResourceByName方法中傳遞此名稱,以授與另一個裝置對共用資源的存取權。 如果您使用具名資源,惡意的使用者可以在執行之前使用此具名資源,並防止應用程式啟動。 若要避免這種情況,請建立隨機命名的資源並儲存名稱,使其只能由授權的使用者取得。 或者,您可以針對此目的使用檔案。 若要將您的應用程式限制為每個使用者一個實例,請在使用者的設定檔目錄中建立鎖定的檔案。
如果您將資源建立為共用,但未指定它使用 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 2008 R2 的 Windows Server 2012 和平臺更新 [傳統型應用程式 |UWP 應用程式] |
目標平台 | Windows |
標頭 | dxgi1_2.h |
程式庫 | Dxgi.lib |