[ itf @ 24.01.2009. 10:14 ] @
U C++u sam napravio jednu ActiveForm komponentu koja se nalazi u ActiveX biblioteci i ona mi predstavlja sučelje za web aplikaciju. Pri instalaciji te komponente na web-u moram znati njen CLASSID, te me tu zbunjuju neke stvari.

1) Da li je CLASSID isto što i GUID (Global Unique Identifier)? Negdje sam našao da jest, a negdje da nije.
2) Pri kreiranju praznog ActiveX-a dobijem njegov GUID, dok npr. pri kreiranju ActiveForm/COM komponente dobijem zasebno GUID za interface i coclass. I sad.. koje od ovo troje ja mogu iskoristiti kao CLASSID (ukoliko je CLASSID isto što i GUID) za instalaciju na web-u?
3) Pošto se CLASSID/GUID očito definira pri samom kreiranju kontrole čime se osiguralo da je to baš jedinstveni identifikator, i da baš niti jedna komponenta na svijetu niti slučajno ne može imati taj isti identifikator?
[ mmix @ 24.01.2009. 14:32 ] @
1. Pa pravilno bi bilo reci da je CLASSID uvek GUID, ali da GIUD nije uvek CLASSID, ali to je vise igra reci. U prevodu jedan GUID moze biti CLASSID, ali i ne mora (moze biti nesto drugo, npr ID uniquidentifier kolone u SQL bazi), dok CLASSID uvek mora biti GUID i ne moze biti nesto drugo. Zasto je ovo mozda vazno , vidi odgovor na 3. pitanje.

2. Za aktiviranje activex objekta potreban je samo CLASSID, consumer (IE npr) ce sam prepostaviti da ActiveX objekat implementira dgovarajuce dispatch interfejse (ako me secasnje sluzi minimum IOleControl i IOleControlSite), i uradice gomilu QueryInterface i TLB operacija da bi utvrdio sta sve tvoj objekat ume i moze i kako da ga iskoristi. Tako da ti efektivno i nije neophodan tvoj poseban dispatch interfejs, ali je naravno moguce imati isti, za slucaj da ga koristis iz specijalizovanog konzumera kojem taj interfejs znaci nesto. Da bi se interfejs registrovao na sistemu mora da ima svoj UUID isto kao i coclass, ali to nema nikakvog uticaja na standardne konzumere kao sto je IE.
Na osnovu toga sto si napisao (ActiveForm) pretpostavljam da koristis Borland C++ Builder; uvek napomeni koji alat koristis posto razni alati razlicito pristupaju RAD-ovanju activeX-a. Ako se dobro secam Delphi-a u OBJECT tag stavljas classid od same activeform-e.

3. GUID je Microsoftova implementacija UUID v4 standarda. Imali smo slicnu pricu ovome oko kolizije GUID poja u SQL-u:
Citat:
Za V4 koji jeste u upotrebi danas bazna verovatnoca je 1 prema 2^122 (1.9e-37) da ces generisati isti GUID globalno. U okviru istog domena, npr tabele, cak i da ista ima milijardu redova sansa za pojavljivanje jedne jedine kolizije je i dalje za prakticnu primenu [utl=http://en.wikipedia.org/wiki/Universally_Unique_Identifier#Random_UUID_probability_of_duplicates]dovoljno blizu 0%[/url]


Tako da nemoj da brines, sanse su astronomske da uopste dobijes duplikat. I pored toga smo videli da nisu SVI generisani GUIDi napravljeni u domenu CLASSID-eva (pitanje 1), tako da su sanse da natrcis na isti v4 CLASSID globalno jos i manje (tj ako i postoji kolizija izmedju tvog CLASSID-a i npr instance UUID kljuca u SQL serveru to je nevazno jer se ta dva guid-a nece nikad sukobiti).
[ itf @ 24.01.2009. 15:12 ] @
zahvaljujem
[ Nedeljko @ 24.01.2009. 17:52 ] @
ClassID bi trebao da bude GUID generisan jednom za svagda za jednu klasu.
[ deerbeer @ 24.01.2009. 20:25 ] @
U teoriji COM interfejsa svaka komponenta ima svoj CLASSID zapisan u registry-iju
Instanciranje kontrole radis preko ClassID a posle toga radis QueryInterface po IID- inerfejs ID
ili samo odredjena enkapsuklacija tj. set metoda koji te u tom trenutku interesuje .
(da li samo user-interfejs i eventi koji ide uglavnom preko IDIspatch-a
ili samo odredjene f-ije bez user-interfejsa)
Ono sto im je zajednicko je to da imaju iisto GUID samo u
razlicitoj reprezentaciji :

Code:

Registry format {5F2D8068-4D1C-4008-A5DA-5CD197139CB1}  


Code:

kao struktra u tlb ili tlh fajlu 
// {5F2D8068-4D1C-4008-A5DA-5CD197139CB1}
static const GUID <<name>> = 
{ 0x5f2d8068, 0x4d1c, 0x4008, { 0xa5, 0xda, 0x5c, 0xd1, 0x97, 0x13, 0x9c, 0xb1 } };


Code:

kao win-api :
// {5F2D8068-4D1C-4008-A5DA-5CD197139CB1}
DEFINE_GUID(<<name>>, 
0x5f2d8068, 0x4d1c, 0x4008, 0xa5, 0xda, 0x5c, 0xd1, 0x97, 0x13, 0x9c, 0xb1);


Code:

ili kao OLE makro 
// {5F2D8068-4D1C-4008-A5DA-5CD197139CB1}
IMPLEMENT_OLECREATE(<<class>>, <<external_name>>, 
0x5f2d8068, 0x4d1c, 0x4008, 0xa5, 0xda, 0x5c, 0xd1, 0x97, 0x13, 0x9c, 0xb1);