Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

COM objekti AddRef() pitanje

[es] :: C/C++ programiranje :: COM objekti AddRef() pitanje

[ Pregleda: 2095 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

glorius
Damir Nikolic
C++ developer
SR

Član broj: 4366
Poruke: 428
212.200.234.*

ICQ: 208550327


+14 Profil

icon COM objekti AddRef() pitanje01.12.2007. u 17:18 - pre 198 meseci
Verovatno bi pravi odgovor na ovo pitanje trebao da bude "nauci COM" ali, meni su potrebne samo osnovne stvari...

Kada se koristi AddRef() ?

Da li je to fora kao 'ko sve own-uje' pokazivac?

Code:

Interface * int1; // ovaj interface je vec definisan

Interface * int2 = int1;
int1->AddRef();



Da li ovo znaci da je sad:
- reference counter int2 == 1
- reference counter int1 == 2

I kada 'unistim' int2 ( Release ), automatski se i u int1 smanjuje reference counter za 1 ( posto int2 pokazuje na int1 ) ???

Tj, ne moram da brinem o counting-u na oba mesta?
EOF
 
Odgovor na temu

milanche
San Francisco

Član broj: 2447
Poruke: 1200
*.hsd1.ca.comcast.net.



+1001 Profil

icon Re: COM objekti AddRef() pitanje01.12.2007. u 17:31 - pre 198 meseci
To bi odprilike bio klasican scenario koriscenja AddRef( ). Mnogo cesce se koriste preostala
dva IUnknown metoda (CoCreateInstance, Release)

U gomili ostalih slucajeva reference count se inkrementira na 'nevidljive' nacine - tokom
instancioniranja objekta (kada postaje 1), prilikom kopiranja na stack (kad se prosledjuje
nekoj funkciji).

Citat:
Verovatno bi pravi odgovor na ovo pitanje trebao da bude "nauci COM"


Direktan odgovor: ako pointer pokazuje na objektov IUnknown interface i ti pozoves Release( )
metod, nema mnogo izbora nego da se dekrementira refCount. Objekat ne pravi razliku ko od
korisnika ga je pozvao.

Odgovor mozes lako da saznas i bez da odvalis citanje COM dokumentacije - AddRef( ) vraca
vrednost trenutnog refCount-a, tako da mozes na svakom zanimljivom mestu u kodu da ubacis
ovaj debug kod i da saznas sto te zanima.

Code:

printf("RefCount = %d\n", tvojObjekt->AddRef());
tvojObjekt->Release();
 
Odgovor na temu

glorius
Damir Nikolic
C++ developer
SR

Član broj: 4366
Poruke: 428
212.200.234.*

ICQ: 208550327


+14 Profil

icon Re: COM objekti AddRef() pitanje01.12.2007. u 17:54 - pre 198 meseci
Hvala! Isprobavacu pa cu skapirati 'prirodu' Bill Gates-ovih izmisljotina :).
EOF
 
Odgovor na temu

milanche
San Francisco

Član broj: 2447
Poruke: 1200
*.hsd1.ca.comcast.net.



+1001 Profil

icon Re: COM objekti AddRef() pitanje01.12.2007. u 18:52 - pre 198 meseci
Citat:
glorius: Hvala! Isprobavacu pa cu skapirati 'prirodu' Bill Gates-ovih izmisljotina :).


COM je prilicno genijalna izmisljotina, iskorak dalje u odnosu na objektno-orjentisano programiranje koje implementira
source-code reuse, a COM je binary code reuse princip:

Modul jednom kompajliran 1996-te na Islandu radi odmah u sprezi sa modulom jednom kompajliranim 2007-me na Novom Zelandu
na bilo kojoj masini bilo gde na svetu, bez potrebe da se bilo sta ikada iskompajlira - sve sto treba su binaries, i da se dva
puta izvrsi regsvr32 <module_name> na doticnoj masini.

Iako industrija nikako ne zeli da se osloni na zli Microsoft, malo-malo pa naidjem na COM-like implementacije, od embedded
pa sve do pojedinih proprietary Linux-based platformi. Svi mudro cute i prave se mutavi, a kad malo zagrebes vidis da su
skoro do koske iskopirali COM, pocevsi od 128 bita za identifikaciju modula (GUID), preko cuvene trojke CoCreateInstance,
AddRef, Release (mozda samo pod drugim imenima).

U svakom slucaju, skapirati COM je vrlo dobra ideja.
 
Odgovor na temu

glorius
Damir Nikolic
C++ developer
SR

Član broj: 4366
Poruke: 428
212.200.234.*

ICQ: 208550327


+14 Profil

icon Re: COM objekti AddRef() pitanje01.12.2007. u 19:11 - pre 198 meseci
Do sada sam koristio COM vrlo malo ( inicijalizacija DirectX objekata i u Microsoft Speech SDK ).

COM jeste mocna stvar ( poceo sam i sam da ga izucavam pre nekoliko godina ali, velika je oblast pa sam odustao ).

Cini mi se da je IUnknown interfejs neshto slicno Smart pointerima samo sto smart pointeri ( pricam konkretno o smart pointerima iz STL biblioteke ) ne dozvoljavaju da dodje do toga da nekoliko pointera 'zastupa' jedan objekat dok se kod IUnknown interfejsa o tome vodi racuna preko reference count-a da ne bi doslo do memory leak-a ili druge 'bolesti'...

Sad ne znam da li sam u pravu ali, definitivno cu se baciti na obnavljanje COM-a.
EOF
 
Odgovor na temu

milanche
San Francisco

Član broj: 2447
Poruke: 1200
*.hsd1.ca.comcast.net.



+1001 Profil

icon Re: COM objekti AddRef() pitanje01.12.2007. u 20:03 - pre 198 meseci
Slicnosti ima, medjutim glavni princip je nesto sasvim drugo, a bazira se na principu zivota u
civilizaciji: zavisno od situacije i uloge koju u toj situaciji igra, objekat eksponira spoljnom svetu
samo i jedino interfejs, dok detalji njegovog unutrasnjeg funkcionisanja ostaju njegova privatna
stvar.

Osoba XYZ moze u isto vreme da bude knjigovezac (preko dana) i trombonista (uvece), pri cemu
za potrebe knjigovezackog zanata ima radnju i salter preko kojega prima narudzbine, pregovara o
poslu, isporucuje ukoricene knjige kupcima. Uvece, zatvara radnju (IKoricenje->Release()), seda
u orkestar, vadi note, vadi instrument (CoCreateInstance(&ITrombon)), slusa dirigenta i isporucuje
svoj deo muzike.

U oba scenarija, deo njegove ukupne funkcionalnosti ostaje sakriven od javnosti - dok uvezuje knjige
nikoga ne zanima kakva je juce bila svirka i kakve su ribe sedele u publici, a uvece nikoga ne zanima
kakve je probleme imao u knjigovezackoj radnji.

Upravo taj princip - efikasno suzen spektar interakcije uz garantovan (immutable) interfejs je u osnovi
COM ideje. Modul moze biti pisan u bilo kom programskom jeziku koji podrzava pointere (i calling konvenciju
stdcall), a unutrasnjost modula ostaje privatna stvar dizajnera. Jedino sto klijent treba da zna je GUID
modula, header u kojem se definise interfejs, i GUID interfejsa.

Za razliku od naseg modela zivota u kojem svako zna sve o svakome i sve ide 10X brze preko personalnih
veza nego preko saltera, na ovom modelu pociva civilizacija Zapada.

Sve privatno - seksualna orjentacija, bracni status, starosno doba, zdravstveno stanje, politicka orijentacija,
rasa, nacija,...je off limits. Sve sto se trazi je korektan interfejs za zadatu situaciju i okruzenje. Ako pruzas
usluge opisane interfejsom, niko te ne pita za bilo sta drugo (cak je vrlo nepozeljno). Mozes da budes sta
hoces u svom slobodnom vremenu i dokle hoces, i da se menjas po svom ritmu.

IUnknown je u celoj prici samo potvrda da objekat postoji u sistemu na najbazicnijem nivou (nesto nalik na
"Dobar dan - dobar dan"), i da je spreman za nastavak komunikacije, tj. pregovora o potencijalnim uslugama
preko drugih interface-ova.

[Ovu poruku je menjao milanche dana 02.12.2007. u 02:42 GMT+1]
 
Odgovor na temu

baseQ
Petrovic Braca
Beograd

Član broj: 125370
Poruke: 70
*.dynamic.sbb.co.yu.



Profil

icon Re: COM objekti AddRef() pitanje02.12.2007. u 00:07 - pre 198 meseci
@ milanche
Svaka cast !
'Think evolution, not revolution.'
 
Odgovor na temu

[es] :: C/C++ programiranje :: COM objekti AddRef() pitanje

[ Pregleda: 2095 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.