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

时间:2019-02-04 15:07:53

标签: c++ directx

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

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

我想/需要在另一侧使用它,以通过DXDevice11->OpenSharedResource(rSharedHandle, __uuidof(ID3D11Resource), (void**)(&TmpResource11));

进行共享

有关该过程的完整说明,请参见here


我遇到了这个问题,但作为答案却不够清楚,以至于我理解它们的含义。 See this here

我还遇到了heremarshal_as,但我不了解如何使用它。有关所采用类型的更多详细信息,请参见here


编辑(1): 如果可能,我不想处理托管代码。因此,我搜索了更多有关“如何在进程之间传递/共享句柄”的信息。我遇到了函数DuplicateHandle()See here),但是由于句柄的类型不是有效的类型(See list in Remarks section),所以我找不到它是否不起作用,或者是因为其他原因(未知)。

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

2 个答案:

答案 0 :(得分:0)

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

查看Windows标头(例如winnt.h),我们可以找到HANDLE的typedef:

typedef void *HANDLE;

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

答案 1 :(得分:0)

我发现了一种简单(总的)方法。比最终产品更多的是工作量的证明,但它确实有效!

我的处理方式如下:

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

它看起来很简单,却很好用。

如果您想要/需要更多详细信息,请随时在评论中提问。