如何将 DirectX 共享资源的句柄传递给另一个(不相关的)进程?

How do I pass a handle of DirectX shared resource to another (unrelated) process?

我正在尝试在两个不相关的进程(无子进程)之间传递 HANDLE

这个HANDLE rSharedHandle来自DXDevice9->CreateTexture(w, h, 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &pTexture9, &rSharedHandle);

而且我希望/需要在另一端使用它以使用 DXDevice11->OpenSharedResource(rSharedHandle, __uuidof(ID3D11Resource), (void**)(&TmpResource11));

共享

可在 here.

中找到该过程的完整说明


我遇到了这个问题,它作为答案但不够清楚,我理解它们的意思。 .

我也遇到了 marshal_as 的解释 here, but I don't understand how to use it in my case. Further details about the types taken can be found here


编辑(1): 如果可能的话,我不想处理托管代码。所以我搜索了更多关于 "How to pass/share handle between processes" 的信息。我遇到了函数 DuplicateHandle() (See here) but I cannot find whether it doesn't work because the type of the handle is not a valid type (See list in Remarks section),还是因为其他原因(未知)。

此外,第二个进程句柄需要在 DuplicateHandle() 之前发送(在函数本身中使用)并且生成的重复句柄需要发送到第二个进程(最终被使用)。

您是否混合托管和非托管代码? - 如果不是,我认为可能不需要所有关于编组的文档。假设,您已经有一些在两个进程之间传输数据的方法,我会尝试以下直接方式:

查看 Windows headers(例如 winnt.h),我们可以找到 HANDLE 的类型定义:

typedef void *HANDLE;

因此,您可以尝试 static_cast 发送方 uint64_t (在 x64 系统上)的句柄,将其传送给接收方,然后 static_cast 返回给句柄。

我找到了一种简单(粗暴)的方法。它比最终产品更像是工作证明,但它正在运行!

我的处理方式如下:

  1. 在第一个过程中从纹理创建 rSharedHandle(我们称之为 P1)
  2. 我将句柄对应的8个字节写入二进制文件
  3. 在 P2 中,我读取相同的文件并设置 rSharedHandle(在 P2 中)

虽然看起来很简单,但效果很好。

如果您want/need了解更多详情,请随时在评论中提问。