Как я узнаю, что COM-объект совместим с различными COM UUIDS? - PullRequest
2 голосов
/ 23 октября 2019

На основе MSDN для Direct 3D 11 Graphics в разделе документации «Как создать непосредственный контекст» показан следующий код:

ID3D11Texture2D* pBackBuffer;
// Get a pointer to the back buffer
hr = g_pSwapChain->GetBuffer( 0, __uuidof( ID3D11Texture2D ),
( LPVOID* )&pBackBuffer );

Здесь, называемый pBackBuffer, имеет тип ID3D11Texture2D. Документация по методу GetBuffer (https://docs.microsoft.com/en-gb/windows/win32/api/dxgi/nf-dxgi-idxgiswapchain-getbuffer) описывает второй параметр как тип REFIID (The type of interface used to manipulate the buffer), а третий как void** A pointer to a back-buffer interface.

Теперь другой раздел в документации по Direct2dпоказывает следующий фрагмент для записи содержимого Direct2d в буфер Direct3d:

 hr = m_pSwapChain->GetBuffer(
        0,
        IID_PPV_ARGS(&pBackBuffer)
        );

Здесь BackBuffer используется в CreateDxgiSurfaceRenderTarget в качестве первого параметра, который является IDXGISurface, что означает, что Backbuffer, который я получил, является IDXGISurface.

Как узнать, что я могу передать ID3D11Texture2D и IDXGISurface этому методу GetBuffer, когда MSDN описывает параметр только как REFIID (см. Выше)? И как я могу выяснить, что еще яможет пройти там?

1 Ответ

0 голосов
/ 25 октября 2019

TL; DR: прочитайте статью Microsoft Docs Программирование DirectX с помощью COM .

API-интерфейсы DirectX используют "облегченную" форму COM, поэтому они нене полностью реализовать все возможные функции объектной модели компонентов (COM):

  • Они используют подсчет ссылок на весь срок службы, используя IUnknown, но это модифицированная форма, где IDeviceChild объекты будут всебыть немедленно недействительным, когда их родительский интерфейс IDevice полностью освобожден. Вы можете использовать AddRef и Release, хотя для C ++ вам лучше использовать что-то вроде ComPtr .

  • API DirectX не поддерживают "одиночныеквартира с резьбой "

  • Некоторые API DirectX не поддерживают CoCreateInstance и должны создаваться через определенный фабричный API.

  • Они не поддерживаютреализовать агрегирование.

  • API-интерфейсы DirectX обычно не реализуют поведение вне процесса / удаленный процесс

На ваш вопрос, API-интерфейсы DirectX в целомподдерживает ограниченное количество интерфейсов, и вы используете QueryInterface для их понижения. Данный объект DirectX будет поддерживать IUnknown и IID для каждого класса в иерархии в этой системе (т. Е. Если это ID3D11Device2, то он будет поддерживать ID3D11Device1 и ID3D11Device). В C ++ вы, как правило, просто используете наследование для перехода вверх по иерархии, но вы можете использовать QueryInterface.

В противном случае будет только несколько конкретных случаев, когда объекты поддерживают несколько интерфейсов, например взаимодействие DXGI сDirect3D для swapchains или общих для устройства текстур . Другими словами, большинство случаев приводит к E_NOINTERACE.

См. Также Модель объектов компонентов и Подсчет ссылок (Direct3D 10) ,

...