ID3D11DeviceContext方法(存在于其上的方法除外) ID3D11DeviceChild)不是自由线程的,也就是说,它们需要单个 穿线。只有一个线程可以安全地调用它的任何方法 (一次绘制,复制,映射等)。
我想知道我是否可以让COM为我做ID3D11DeviceContext
同步。
假设我这样做(简化代码):
CoInitializeEx( NULL, COINIT_APARTMENTTHREADED );
// Create D3D11Device
CComPtr<ID3D11DeviceContext> pD3D11DeviceContext;
pD3D11Device->GetImmediateContext(&pD3D11DeviceContext);
然后我要么将其编组:
IStream* pStreamD3D11DeviceContext = NULL;
CComPtr<IUnknown> pUnknownD3D11DeviceContext;
pD3D11DeviceContext->QueryInterface(IID_PPV_ARGS(&pUnknownD3D11DeviceContext));
::CoMarshalInterThreadInterfaceInStream( __uuidof(ID3D11DeviceContext), pUnknownD3D11DeviceContext, &pStreamD3D11DeviceContext );
或者我们是GIT表:
CComPtr<IGlobalInterfaceTable> pIGlobalInterfaceTable;
::CoCreateInstance( CLSID_StdGlobalInterfaceTable, NULL, CLSCTX_INPROC_SERVER, IID_IGlobalInterfaceTable, (void **)&pIGlobalInterfaceTable );
CComPtr<IUnknown> pUnknownD3D11DeviceContext;
DWORD dwCookieD3D11DeviceContext = 0;
pD3D11DeviceContext->QueryInterface(IID_PPV_ARGS(&pUnknownD3D11DeviceContext));
pIGlobalInterfaceTable->RegisterInterfaceInGlobal( pUnknownD3D11DeviceContext, __uuidof(ID3D11DeviceContext), &dwCookieD3D11DeviceContext );
不幸的是,这似乎不起作用。
CoMarshalInterThreadInterfaceInStream
返回REGDB_E_IIDNOTREG
(0x80040155, Interface not registered
),pStreamD3D11DeviceContext
仍为NULL。
GIT方法更进了一步。我得到了cookie,但是当我尝试在另一个MTA线程上使用它时,GetInterfaceFromGlobal返回E_INVALIDARG。
CComPtr<ID3D11DeviceContext> pD3D11DeviceContext;
hresult = pIGlobalInterfaceTable->GetInterfaceFromGlobal( dwCookieD3D11DeviceContext, __uuidof(ID3D11DeviceContext), (void**)&pD3D11DeviceContext );
GetInterfaceFromGlobal
的参数似乎没问题,我测试了将指针放回原始线程并且它有效。
D3D11Device
和D3D11DeviceContext
似乎是无编组的。显然我既没有代理DLL也没有d3d11的类型库。
我错过了什么吗?
谢谢。