Autor Wątek: Jak działają metody QueryInterface i GetParent??  (Przeczytany 1544 razy)

Offline andy939

  • Użytkownik

# Marzec 28, 2015, 23:15:38
Witam!
Uczę się directX11 z książki "Wprowadzenie do technologi directx11 Frank D.Luna"
I stanołem na samym początku zabawy z kodem. Żeby stworzyć SwapChain robi tam coś takiego:
IDXGIDevice * dxgiDevice = 0;
mD3dDevice->QueryInterface( __uuidof( IDXGIDevice ),( void ** ) & dxgiDevice );

IDXGIAdapter * dxgiAdapter = 0;
dxgiDevice->GetParent( __uuidof( IDXGIAdapter ),( void ** ) & dxgiAdapter );

IDXGIFactory * dxgiFactory = 0;
dxgiAdapter->GetParent( __uuidof( IDXGIFactory ),( void ** ) & dxgiFactory );

dxgiFactory->CreateSwapChain( mD3dDevice, & sd, & mSwapChain );
i nie daje żadnego wytłumaczenia, sprawdzielm pare innych anglojęzycznych książek i jest tak samo.

Niemoge sobie wyobrazić jak działają te dwie metody QueryInterface oraz GetParent.
Wyczytałem na MSDN że QueryInterface sprawdza intefejs obsługuje zadany w parametrze intefej i jeśli tak to zwraca wskaźnik do niego albo jakiś błąd. Ale o co chodzi że wspiera?? Jest to jakiś rodzaj rzutowania ?? dlaczego niemoge poprostu sobie stwożyć IDXGIDevice tylko takie coś robić?
A GetParent wygląda mi na to samo tylko sie inaczej nazywa?

Bardzo proszę o jakieś przybliżenie tematu, bo naprawdę nie wiem na czym stoje. Bo jak narazie to widze tylko kawałek kodu do nauczenia na pamieć, albo kopiuj wklej

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Xion

  • Redaktor
    • xion.log

# Marzec 28, 2015, 23:41:05
QueryInterface() i GetParent() to COM-owe wynalazki (google "Microsoft COM"), które są dosyć niskopoziomowe. Jestem prawie pewien, że standardowy sposób tworzenia czegokolwiek w DX nie powinien o nie nawet zahaczać. Posuzkaj jakichś innych przykładów.

Offline Reg

  • Administrator
    • Adam Sawicki - Home Page

# Marzec 29, 2015, 20:17:34
Do tego trzeba rozumieć 1. programowanie obiektowe, szczególnie koncepcję interfejsów, 2. specyfikę COM. W C++ nie ma interfejsów (jest za to wielodziedziczenie), ale w teorii (i w wielu językach, np. C#) jest coś takiego. Chodzi o to, że interfejs definiuje zbiór metod, a faktyczny obiekt może implementować wiele interfejsów. Wskaźnik do obiektu w swoim programie masz zawsze zdefiniowany jako wskaźnik do danego typu interfejsu. Metoda QueryInterface służy do pobrania wskaźnika na inny interfejs, o ile jego również implementuje podany obiekt. Będzie to wskaźnik odnoszący się do tego samego obiektu.

Offline andy939

  • Użytkownik

# Marzec 29, 2015, 23:28:27
ok QueryInterface już jakoś rozumiem, jeszcze tylko getParent nie mogę się doszukać, chociaż czytając o COM i QueryInterface gość zapodawał  przykład z klasami zagnieżdżonymi więc może parent to po prostu klasa wyżej.

I takie jedno pytanie czy żeby programować w directX muszę się jakoś dobrze znać na COM żeby go używać ?? Mało jest materiałów na ten temat, chyba nie jest zbyt lubiany

Offline 10log

  • Użytkownik

# Marzec 29, 2015, 23:36:05
W C++ nie ma interfejsów (jest za to wielodziedziczenie)

Można zrobić klasę z metodami pure virtual i będzie spełniać taką samą funkcję jak interface. W C++ brak jest słów kluczowych interface i implements ale interface'y można robić jak najbardziej.

Offline Reg

  • Administrator
    • Adam Sawicki - Home Page

# Marzec 31, 2015, 00:14:22
Na szczęście do programowania w DirectX nie trzeba dobrze rozumieć COM. W pewnym sensie wystarczy może nawet używanie takich dziwnych fragmentów, jaki tutaj omawiamy, za pomocą kopiuj-wklej :) Poza tym to już zwykłe wskaźniki i programowanie obiektowe, w sensie wywoływania wskaźnik_na_obiekt->metoda().

Co innego, gdybyś musiał pisać własne klasy COM - wtedy to trzeba znać lepiej.