UWP 和 win32 应用程序之间共享 DirectX 纹理 2D

问题描述 投票:0回答:1

我正在尝试在 uwp 应用程序和 win32 应用程序之间设置共享纹理 2D。我在 UWP 应用程序中有以下代码:

HRESULT result;
D3D11_TEXTURE2D_DESC texDesc;
texDesc.Width = 360;
texDesc.Height = 360;
texDesc.MipLevels = 1;
texDesc.ArraySize = 1;
texDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM_SRGB;
texDesc.SampleDesc.Count = 1;
texDesc.SampleDesc.Quality = 0;
texDesc.Usage = D3D11_USAGE_DEFAULT;
texDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_UNORDERED_ACCESS | D3D11_BIND_RENDER_TARGET;
texDesc.CPUAccessFlags = 0;
texDesc.MiscFlags = D3D11_RESOURCE_MISC_SHARED_NTHANDLE | D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX;

result = device->CreateTexture2D(&texDesc, &textureDataDesc, &texture2D);

IDXGIResource1* resource;
texture2D->QueryInterface(__uuidof(IDXGIResource1), (void**)&resource);
result = resource->CreateSharedHandle(
             nullptr,
             DXGI_SHARED_RESOURCE_READ | DXGI_SHARED_RESOURCE_WRITE,
             L"SharedTexture2D",
             &handle);

Win32 应用程序代码:

ID3D11Texture2D* texture;
HRESULT result = d3d11Device->OpenSharedResourceByName(
                     L"SharedTexture2D",
                     DXGI_SHARED_RESOURCE_READ | DXGI_SHARED_RESOURCE_WRITE,
                     __uuidof(ID3D11Texture2D),
                    (void**)&texture);

UWP 创建共享句柄并返回 S_OK。然后,我尝试从 win32 应用程序打开资源,出现 E_INVALIDARG 一个或多个参数无效的错误代码。

当我有两个 win32 应用程序时,上面的解决方案有效。有什么问题,我该如何处理?

我猜测和UWP沙箱有关,可能需要设置一些安全属性或者修改共享资源的名称,但我找不到任何信息。

提前致谢!

winapi uwp directx direct3d11 dxgi
1个回答
0
投票

问题在于 SharedTexture2D 不是完全限定的对象名称,因此当您从 Win32 应用程序使用它时它不存在。

我相信您需要使用 Win32 应用程序中的 GetAppContainerNamedObjectPath

有一些关于如何获取共享句柄以获得对特定 UWP SI 可见的正确权限的具体说明。请参阅Microsoft Learn。您也许可以通过提供非空

SECURITY_ATTRIBUTES
来使其工作,但这主要是 UWP 尝试打开由 Win32 应用程序创建的句柄 的问题,这与您的场景相反。

© www.soinside.com 2019 - 2024. All rights reserved.