Održavanje kompatibilnosti COM interfejsa u VB6 projektima

The binary compatibility DLL or EXE contains a parameter type or return type whose definition can not be found

Greška označava narušavanje kompatibilnosti na nivou fajla koji bi trebao kompatibilnost da održava.

Na ovom primeru razmatraće se situacija sa BLRManufSif.dll bibliotekom.

Kako je rešeno ?

1. Ako zvirnemo u TypeLib (i uvek samo tamo) u potrazi za BLRManufSif.dll-om videćemo da su tamo registrovane 3 verzije: x.a, x.b i x.c. X.C je najnovija.
2. Pogledamo isti ključ na MSRV i vidimo da je tamo samo najnovija verzija X.C.
3. Obrišemo “viškove” u registru u kom smo ih našli (x.a i x.b)
4. Guala ! Problem sa DLL kompatibilnosti rešen !


Zašto ?

Pretpostavimo da je CopyOf.. nastao u doba dok je bila aktuelna verzija X.A neke komponente od koje zavisimo. U međuvremenu verzija se popela na X.C koji nije sasvim kompatibilna sa X.A. Šta će se desiti ?

DLL za održanje kompatibilnosti pokušava da nađe otisak revizija X.A i ako u tome uspe uporediće ga sa sadašnjim i utvrditi da ne valja. Kako je to neočekivano, i poruka je blesava.
Onda se ja dosetim i obrišem iz registra podatak da je uopšte registrovana X.A verzija. Sada se DLL pali, gleda u registru da li postoji X.A, vidi da nema, pa onda kako ima instrukciju da traži novije verzije, pronalazi X.C. Njegov otisak uspešno upoređuje sa tekućom registracijom i sadržajem DLL-a i sve je u redu.

Ukratko…grešku ovog tipa “DLL or OCX compatibility can't find…bla,bla…” po pravilu možeš rešiti na ovaj način.


Šta još može da se nađe ?

Ovo nije opasno jer je GUID drugačiji, ali ponekad se može desiti da u potrazi za DLL-om, po imenu, naiđeš na “ostatak” stare registracije. Obično će verzija biti znatno manja od tekuće, kažem, i GUID će biti drugačiji, ali može da zbuni.
Da bi bio siguran da se radi o “duhu”, obrišeš podatak o registraciji (samo verziju) ponovo registruješ komponentu i proveriš da li se podatak o registraciji vratio. Ako nije, obrišeš ceo ključ.