Potwór zwany COM, część 2


Warsztat - Programowanie gier komputerowych :: Potwór zwany COM, część 2







Strona główna Forum Szukaj Lista użytkowników
Grupy
Zarejestruj Zaloguj

Artykuły
Kliknij na kategorię żeby dodać artykuł Szukaj
Programowanie gier » Artykuły [Wersja do drukowania]
Potwór zwany COM, część 2
Opis Interfejs IUnknown
Autor artpoz Data Pią 12 Lis, 2004 10:55 pm Typ **
Słowa klucze
Kategoria Artykuły
Odsłony 832


Potwór zwany COM, część 2
Interfejs IUnknown

Interfejs IUnknown

W dzisiejszym odcinku przyjrzymy się bliżej samym
komponentom. Komponenty są zazwyczaj przechowywane w
plikach DLL i łączone dynamicznie w trakcie pracy
programu. O ich budowie opowiadałem w poprzednim
„artykule”. Przypominam, że obiekt COM może posiadać
wiele interfesów, które mogą mieć wiele metod. Jest
jednak jeden interfejs obowiązkowy o nazwie IUnknown,
który posiada trzy metody (funkcje):

• QueryInterface
• AddRef
• Release



Rysunek 3 przedstawia przykładowy obiekt COM. Interfejs
IUnknown ma dwa zadania. Pierwsze z nich to „dostanie
się” do pozostałych interfejsów, drugie to regulowanie
czasu życia obiektu. Aby mieć dostęp do jakiegoś innego
niż IUnknown interejsu musimy mieć do niego wskaźnik.
Wskaźnik ten da nam funkcja QueryInterface, jeśli podamy
jej tzw. identyfikator interfejsu (IID). Jest to
128-bitowa liczba, która nam jednoznacznie określa dany
interfejs. W ten sposób mówimy funkcji jaki interfejs
nas interesuje. Czas życia obiektu regulują dwie
funkcje: AddRef i Release. Ta pierwsza zwiększa licznik
odwołań, ta druga go zmniejsza. Licznik odwołań jest to
liczba typu ULONG (unsigned long), która określa ile
obiektów zostało utworzonych. Jeśli wartość ta spadnie
do zera, obiekt jest niszczony (zwalniana jest pamięć).

Uwzględniamy dziedziczenie

Aby uprościć rozważania pominąłem bardzo istotny
szczegół, który teraz trzeba jeszcze wziąść pod uwagę, a
minanowicie dziedziczenie. IUnknown można traktować jako
klasę abstrakcyjną z samymi czysto wirtualnymi
funkcjami. W tłumaczeniu z języka IDL, w którym pisze
się komponenty, na (znany wam doskonale ) C++ wygląda
to tak:


class IUnknown
{
public:
virtual HRESULT QueryInterface(const IID& idd,void**
ppVObj) = 0;
virtual ULONG AddRef( void ) = 0;
virtual ULONG Release( void ) = 0;
}


Każdy kolejny interfejs musi być odziedziczony po
IUnknown i posiadać własne implementacje funkcji
QueryInterface, AddRef i Release. Zatem nasz prawidłowy
schemat obiektu powinien wyglądać raczej tak jak na
rysunku 4.



QueryInterface

Funkcja QueryInterface niejako „przepytuje” (query)
obiekt o dodatkowe interfejsy i zwraca jako rezultat
32-bitową liczbę typu HRESULT (long). Jeśli to
sprawdzanie się powiedzie, funkcja zwraca wartość
dodatnią lub zero (jako S_OK), jeśli nie to wartość
ujemną (E_NOINTERFACE) i ustawia wskaźnik na NULL.
Istnieją też dwa makra zdefiniowane w pliku WinError.h,
które ułatwiają sprawdzanie czy wartość HRESULT jest
dodatnia lub równa zero (operacja udała się) czy ujemna
(błąd).


#define SUCCEEDED(Status) ((HRESULT) (Status) >= 0)
#define FAILED(Status) ((HRESULT) (Status) < 0)



Jak to wygląda w praktyce ? Otóż jeżeli funkcja
QueryInterface zwróci wskaźnik do interfejsu to już sama
wywołuje funkcję AddRef, a ta ustawia licznik odwołań na
1. Jednak zmniejszenie tego licznika o 1 funkcją Release
i tym samym zwolnienie pamięci należy już do samej
aplikacji.

autor: Artur Poznański (artpoz)


Skocz do: Wybierz forumWarsztat - Programowanie
gier komputerowych|--Szkółka| |--Szkółka -
języki| |--Szkółka - grafika| |--Szkółka -
inne|--Programowanie gier| |--Ogólnie|
|--Dźwięk| |--Sztuczna Inteligencja|
|--Inne|--Programowanie grafiki|
|--Programowanie grafiki| |--OpenGL|
|--DirectX|--Produkcja| |--Pomysły|
|--Projektowanie| |--Projekty| |--Grafika|
|--Ogłoszenia|--O czym innym| |--Konferencje,
spotkania| |--Warsztat| |--Aktualności|
|--Artykuły| |--Wykłady| |--Compo|
|--Lepperlandia|--Śmietnik| |--Z odrzutu



Powered by Knowledge Base, wGEric (C) 2002 PHPBB.com MOD
This script (Knowledge Base - MX Addon v. 1.03e) is modified
by Haplo





W1.5b (C) 2004
[admin: ayufan, g[R]eK, Goliatus, mikael_, Regedit]
Wszystkie czasy w strefie CET (Europa)

Powered by phpBB2 Plus 1.52 based on phpBB 2.0.10 © 2001, 2002 phpBB
Group :: FI Theme :: Mody i Podziękowania












Wyszukiwarka

Podobne podstrony:
Potwór zwany COM
czesc rozdzial
www livemocha com angielski lekcja audio
czesc 1
Thaumasyt – Część 1 Droga do powszechnie przyjętego zrozumienia
Diagnostyka OBD EOBD OBD2 Opis VAG COM
czesc rozdzial
Lite Com Pro Pl
czesc rozdzial

więcej podobnych podstron