Interfejsy i GUID

0

Cześć. Wszędzie, gdzie czytam, piszą że interfejs musi mieć swój własny GUID. OK. Ale zastanawia mnie pewna rzecz. Prawdopodobnie zupełnie niepotrzebnie, ale jak się czegoś nie wie, lepiej się upewnić, niż potem płakać.

Załóżmy taką sytuację.
Jest aplikacja, która zawiera deklarację interfejsu: IMyIface, którego GUID to ABCD(dla uproszczenia)
Jest też biblioteka DLL, która też zawiera deklarację tego samego interfejsu IMyIFace, którego GUID to też ABCD.

Czy wszystko jest OK?
Innymi słowy, jeśli ja jestem twórcą aplikacji, to czy twórcom DLLi muszę podawać ten GUID, czy każdy z nich musi tworzyć nowy? Wydaje mi się, że muszę podawać ten swój, byłoby to naturalne i logiczne.

Teraz pytanie nr 2 z nieco innej beczki.
Załóżmy, że interfejs w pierwszej wersji zawierał deklaracje metod o nazwach: A i B.
I tak też jest stworzony DLL.

Teraz robię nową wersję aplikacji i dorzucam do interfejsu metodę C(czy zmieniam GUID?). Rzecz jasna, prędzej, czy później stara dllka się wywali lub będzie działać niepoprawnie. To teraz pytanie, czy można zrobić coś, żeby ta stara dllka działała poprawnie? Albo jakieś sprawdzenie, jak wygląda jej interfejs(czy ma metodę C, czy nie).

0

Albo jakieś sprawdzenie, jak wygląda jej interfejs(czy ma metodę C, czy nie).

Można by spróbować wykorzystać do tego celu RTTI...

1

Wykorzystaj QueryInterface lub jego biedniejszy odpowiednik (swój) + wersjonowanie interfejsów (IMyFace, IMyFace2, IMyFace3 itd). Microsoft robi nawet różne nazwy DLL-ek jeśli interfejs się znacząco zmienia (Riched32.dll, Riched20.dll, itd).

http://stackoverflow.com/questions/3303362/delphi-how-to-implement-queryinterface-of-iunknown

0

Jest aplikacja, która zawiera deklarację interfejsu: IMyIface, którego GUID to ABCD(dla uproszczenia)
Jest też biblioteka DLL, która też zawiera deklarację tego samego interfejsu IMyIFace, którego GUID to też ABCD.

Dlaczego chcesz dwa razy deklarować ten sam interfejs?
Albo jest naprawdę ten sam (z tym samym GUIDem) albo nie, zdecyduj się.

0

No jeszcze jedno pytanie nie zostało odpowiedziane. Czy jeśli do istniejącego interfejsu dokładam deklarację jakiejś metody, to zmieniam GUID interfejsu?

1
Juhas napisał(a):

No jeszcze jedno pytanie nie zostało odpowiedziane. Czy jeśli do istniejącego interfejsu dokładam deklarację jakiejś metody, to zmieniam GUID interfejsu?

Po prostu przetestuj czy aplikacja ze starym interfejsem Ci zadziała.
GUID teoretycznie służy do identyfikacji interfejsu.
Interfejs albo sam podajesz (jako .pas / .h / .hpp) albo robisz COM-a - który sam eksportuje API.

Wg tego poniżej powinieneś zmienić GUID przy każdej zmianie interfejsu (dla COM):
http://stackoverflow.com/questions/287476/when-to-change-a-guid-on-a-type-library

2

Dodawanie metod robi się zazwyczaj przez dziedziczenie, czyli tak, zmieniasz GUID.
Np. Microsoft nazywa interfejsy tak:

ISuperHiper
ISuperHiper2
ISuperHiper3
ISuperHiper4

Każy kolejny ma więcej metod (dodanych na końcu, kolejność istniejących bez zmian), dziedziczy po poprzednim i ma nowy GUID.

Nie musisz oczywiście zmieniać za każdym razem co 5 minut, jeśli nikomu poprzedniej wersji interfejsu nie dałeś;
za "wersję interfejsu" traktuj tylko ten kod, który świat zobaczył.

PS. kiedy implementujesz nową wersję interfejsu (z cyferką) to starą zostawiasz, dzięki czemu nie zmuszasz wszystkich do przechodzenia na nową wersję.,

1 użytkowników online, w tym zalogowanych: 0, gości: 1