Wygląda na to, że obiekty COM są obiektami ogólnego użytku, którymi zarządza system operacyjny. Obiekty są zgodne ze ścisłym interfejsem i umożliwiają wysyłanie zapytań do obiektów w celu określenia informacji. Czy to są obiekty COM?
COM to mechanizm, który pozwala na ponowne wykorzystanie obiektów (a raczej komponentów), niezależnie od języków używanych przez programistę, który zaimplementował komponent i programistę, który go używa oraz niezależnie od tego, czy komponent został zaimplementowany w programie klienta, czy też w innym miejscu na komputerze (lub w sieci).
Mówiąc ogólnie, każdy składnik COM zapewnia implementację jednego lub większej liczby interfejsów. Te interfejsy są definiowane w sposób neutralny językowo przy użyciu języka definicji interfejsu (IDL) . Na przykład jeden z podstawowych interfejsów COM, IUnknown , jest zdefiniowany w następujący sposób:
interface IUnknown
{
virtual HRESULT QueryInterface(REFIID riid, void **ppvObject) = 0;
virtual ULONG AddRef(void) = 0;
virtual ULONG Release(void) = 0;
};
Ten mały interfejs ma fundamentalne znaczenie w COM, ponieważ każdy składnik COM musi go implementować. Definiuje dwa ważne aspekty maszyny COM:
QueryInterface
umożliwia wywołanie kodu w celu uzyskania implementacji dla znanego interfejsu. W modelu COM do interfejsów odwołują się identyfikatory GUID (znane również jako identyfikatory interfejsów, IID). Jeśli obiekt implementuje kilka interfejsów, w ten sposób kod klienta otrzymuje odniesienie do każdego z tych interfejsów. Działa jak rodzaj operatora odlewania, jeśli wolisz.AddRef()
i Release()
zaimplementuj mechanizm zarządzania pamięcią dla obiektów COM. Jak sama nazwa wskazuje, najpopularniejszym modelem jest mechanizm zliczania referencji, w którym instancja jest niszczona po tym, jak ostatni klient udostępnił jej referencję.Wszystkie składniki COM są rejestrowane w systemie podczas instalacji. Jeśli programista chce użyć jakiegoś komponentu, musi:
CoCreateInstance()
). Możesz zajrzeć do rejestru pod następującymi punktami HKEY_CLASSES_ROOT\CLSID
: każdy identyfikator GUID tam znajduje się (najprawdopodobniej) identyfikator komponentu COM lub interfejsu, a wpisy poniżej tego klucza informują system, w jaki sposób należy go uruchomić.Maszyny COM są niezwykle złożone. Na przykład implementacja lub używanie komponentów COM w C wymaga ogromnej ilości pracy, ale języki wyższego poziomu, takie jak Visual Basic, zrobiły wiele, aby ułatwić implementację i używanie komponentów COM. Korzyści są jednak bardzo realne. Umożliwia pisanie aplikacji, powiedzmy, w języku Visual Basic, ale nadal implementować algorytmy krytyczne dla wydajności w C lub C ++ jako obiekty COM, które mogą być używane bezpośrednio z kodu VB. System dba o uporządkowanie argumentów wywołania metody, przekazując je w razie potrzeby przez wątki, procesy i połączenia sieciowe, tak aby kod klienta miał wrażenie używania normalnego obiektu.
Wiele podstawowych części systemu Windows jest opartych na modelu COM. Na przykład Eksplorator Windows (menedżer plików) jest w zasadzie pustą powłoką. Definiuje kilka interfejsów COM do nawigacji i wyświetlania hierarchii drzew, a cały kod, który faktycznie wyświetla "Mój komputer", dyski, foldery i pliki jest zestawem komponentów COM, które implementują te interfejsy.
Wraz z pojawieniem się .NET COM powoli staje się przestarzały.
COM to mechanizm, który został opracowany, aby umożliwić ludziom dystrybucję plików binarnych, które mogą być ponownie użyte, nawet jeśli wywołujący używał kompilatora C ++ innego producenta lub (ostatecznie) zupełnie innego języka.
Jeśli chcesz dobrego wprowadzenia do COM, przeczytaj Essential COM autorstwa Don Boxa .
źródło