6 folii na stronÄ
6 folii na stronÄ
6 folii na stronÄ
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