[ sspasic @ 16.07.2003. 00:12 ] @
Da ukratko opisem problem - u stvari dva problema koja mislim da imaju isti uzrok:

Problem 1:

Imam ActiveX kontrolu A (ATL) koja za vreme rada instancira ne-vizuelnu kontrolu B (neki drugi programski jezik).
Ako kontrolu B izmenim i dodelim joj sledeci broj revizije A odbija da je instancira na sledeci nacin:

Code:

#import "ime_B_kontrole.dll"
using namespace KontrolaBNamespace;
...
CComPtr<interfejsKontroleB> myCtl;
myCtl.CoCreateInstance(__uuidof(klasaKontroleB));


Ako A prekompajliram ponovo, sa #import-om nove B sve proradi.

Problem 2:

Ovde kontrola A (ATL) definise COM interfejs koji kontrola B (takodje ATL, ali vizuena) implementira.
Kada izmenim kontrolu A i prekompajliram sa uvecanim brojem revizije, kontrola B
prestane da radi sve dok je ne iskompajliram ponovo, sa #import-om nove revizije A.

Obzirom da u programu imam i citav niz drugih kombinacija u raznim MS i ne-MS programskim jezicima (ne pitajte zasto), ovo su jedina dva slucaja gde azuriranje jedne kontrole trazi i azuriranje neke druge, sto bi trebalo da izbegnem kad god je to moguce.

U oba slucaja interfejsi obe kontrole nisu menjani- radi se o izmenama u samoj implemetaciji pojedinih metoda i nuznom povecavanju broja revizije.

Zna li neko zasto se ovo desava?
Koja se to jos informacija sem CLSID-a kontrole zapise u iskompajliran program i da li je to moguce izbeci?

Unapred hvala,
Spaske

[ leka @ 18.07.2003. 14:52 ] @
Ja sam laik za te stvari, ali mi se cini da ta kontrola B treba da se registruje da bi proradila, znaci vidi kako da odradis tu automatizaciju registrovanja. Nije iskljuceno da gresim...
[ sspasic @ 18.07.2003. 16:39 ] @
Kontrola B je registrovana u oba slucaja.
U slucaju 2 ne pomaze ponovna registracija. Samo kompajliranje.

Nego da ispravim sam sebe:
drugi slucaj nisam lepo opisao - greska koja se javlja je da, posto izmenim kontrolu A,
od kontrole B ne mogu da dobijem onaj interfejs iz A (QueryInterface ne uspe) iako ga implementira.

Zato sam i pretpostavio da se u ova dva slucaja sem CLSID-a kod referenciranja na drugu kontrolu pamti jos ponesto mada ne vidim razlog tome...

A bitno mi je da ovo eliminisem - posto je to 'zahtev'.

[ Rapaic Rajko @ 18.07.2003. 18:06 ] @
Sad sam se setio; odgovor je GUID.
Svaki COM interfejs/klasa ima jedinstveni GUID, koji se registruje u Registry bazi i preko kojeg bilo koji jezik (sa podrskom za COM) moze traziti od sistema da mu napravi instancu date COM kontrole. Tvoj wizard verovatno svaki put generise nov GUID, pa onaj drugi typelibrary ne moze da ga kreira.
GUID izgleda kao veliki skup hex cifara razdvojenih crticama (ako se ne varam, 16 bajtova). Proveri da nije to.
Ako jeste, svaki put treba u tvoj kod od TLB-a da upises stari GUID, i nece biti problema.
Pozdrav

Rajko
[ Dragi Tata @ 18.07.2003. 18:45 ] @
Šta god da izmeni, to se zapiše u registry (jedan od razloga zašto ne volim COM). Uporedi stanje pre i posle kompajliranja, pa ćeš da nađeš u čemu je štos.