12.04.2014 Views

6 folii na stronę

6 folii na stronę

6 folii na stronę

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

QueryInterface<br />

T definiuje obiekt<br />

T pozwala udostępniać różne wersje<br />

interfejsów dla tego samego obiektu<br />

T pomaga utrzymać kompatybilność<br />

wstecz przy wypuszczaniu nowej wersji<br />

produktu<br />

T ALE: wymaga to dotrzymania założeń<br />

przez projektanta nowej wersji!!!<br />

Zliczanie referencji:<br />

AddRef/Release<br />

T Klasa składnika zawiera licznik<br />

referencji<br />

T AddRef zwiększa licznik<br />

T Release zmniejsza licznik i w razie<br />

potrzeby usuwa składnik z pamięci<br />

T Utworzenie obiektu = AddRef<br />

T Porzucenie obiektu = Release<br />

Zliczanie referencji:<br />

AddRef/Release<br />

ULONG _stdcall CMyComp::AddRef()<br />

{<br />

return InterlockedIncrement(&m_nRef);<br />

}<br />

ULONG _stdcall CMyComp::Release()<br />

{<br />

if (InterlockedDecrement(&m_nRef) == 0)<br />

{<br />

delete this;<br />

return 0;<br />

}<br />

return m_nRef;<br />

}<br />

AddRef/Release:<br />

trzy proste zasady<br />

T Wywołaj AddRef zanim zwrócisz wynik<br />

T<br />

jeśli zwracasz interfejs jako wartość funkcji. Dotyczy też<br />

QueryInterface i CreateInstance!<br />

T Wywołaj Release kiedy skończysz<br />

T<br />

gdy nie będziesz już dłużej wykorzystywał interfejsu<br />

T Wywołaj AddRef gdy robisz przypisanie<br />

T<br />

AddRef/Release:<br />

Optymalizacja<br />

Nie musisz stosować AddRef/Release w przypadku<br />

użycia wskaźnika o zagnieżdżonym zasięgu<br />

(w obrębie zasięgu innego wskaźnika)<br />

T<br />

T<br />

T<br />

T<br />

T<br />

T<br />

parametr wejściowy – nic (jest zagnieżdżony)<br />

parametr wyjściowy – AddRef<br />

parametr wejściowo-wyjściowy – być może AddRef + Release<br />

zmien<strong>na</strong> lokal<strong>na</strong> – nic (jest zagnieżdżo<strong>na</strong>)<br />

zmien<strong>na</strong> global<strong>na</strong> – AddRef + Release<br />

w przypadku wątpliwości – AddRef + Release<br />

Drugie podejście...<br />

T Słaby punkt:<br />

T funkcja CreateInstance zbyt mocno wiąże<br />

klienta z serwerem<br />

T Rozwiązanie:<br />

T skorzystamy z technologii COM...<br />

3

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!