我正在尝试在两个不相关的进程(没有子进程)之间传递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。
我还遇到了here的marshal_as
,但我不了解如何使用它。有关所采用类型的更多详细信息,请参见here。
编辑(1):
如果可能,我不想处理托管代码。因此,我搜索了更多有关“如何在进程之间传递/共享句柄”的信息。我遇到了函数DuplicateHandle()
(See here),但是由于句柄的类型不是有效的类型(See list in Remarks section),所以我找不到它是否不起作用,或者是因为其他原因(未知)。
此外,第二个进程句柄需要在DuplicateHandle()之前发送(要在函数本身中使用),并且生成的重复句柄需要发送到第二个进程(最终要使用)。
答案 0 :(得分:0)
您是否混合使用托管代码和非托管代码? -如果否,我认为可能不需要有关编组的所有文档。假设您已经有了一些在两个进程之间传输数据的方法,我将尝试以下直接方法:
查看Windows标头(例如winnt.h),我们可以找到HANDLE的typedef:
typedef void *HANDLE;
因此,您可以尝试将句柄static_cast传送到发送方的uint64_t(在x64系统上),将其传输到接收方,然后将其static_cast返回到HANDLE。
答案 1 :(得分:0)
我发现了一种简单(总的)方法。比最终产品更多的是工作量的证明,但它确实有效!
我的处理方式如下:
rSharedHandle
(将其称为P1)rSharedHandle
(在P2中)它看起来很简单,却很好用。
如果您想要/需要更多详细信息,请随时在评论中提问。