Linkowanie i osadzanie obiektów - Object Linking and Embedding

Object Linking & Embedding ( OLE ) to zastrzeżona technologia opracowana przez firmę Microsoft, która umożliwia osadzanie i łączenie z dokumentami i innymi obiektami. Programistom przyniósł OLE Control Extension (OCX), sposób na tworzenie i używanie niestandardowych elementów interfejsu użytkownika. Na poziomie technicznym obiekt OLE to dowolny obiekt, który implementuje IOleObjectinterfejs, ewentualnie wraz z szeroką gamą innych interfejsów, w zależności od potrzeb obiektu.

Przegląd

OLE umożliwia aplikacji edycyjnej eksportowanie części dokumentu do innej aplikacji edytującej , a następnie importowanie jej z dodatkową zawartością. Na przykład system DTP może wysłać tekst do edytora tekstu lub obraz do edytora map bitowych za pomocą OLE. Główną zaletą OLE jest dodawanie do dokumentu różnych rodzajów danych z różnych aplikacji, takich jak edytor tekstu i edytor obrazów. Spowoduje to utworzenie dokumentu w formacie binarnym złożonego pliku i pliku głównego, do którego dokument się odwołuje. Zmiany danych w pliku głównym natychmiast wpływają na dokument, który się do niego odwołuje. Nazywa się to „łączeniem” (zamiast „osadzaniem”).

OLE służy również do przesyłania danych między różnymi aplikacjami za pomocą operacji przeciągania i upuszczania oraz schowka .

Historia

OLE 1,0

OLE 1.0, wydany w 1990 roku, był rozwinięciem oryginalnej koncepcji dynamicznej wymiany danych (DDE), opracowanej przez firmę Microsoft dla wcześniejszych wersji systemu Windows . Podczas gdy DDE ograniczało się do przesyłania ograniczonych ilości danych między dwiema uruchomionymi aplikacjami, OLE był w stanie utrzymywać aktywne połączenia między dwoma dokumentami, a nawet osadzić jeden typ dokumentu w innym.

Serwery i klienci OLE komunikują się z bibliotekami systemowymi za pomocą wirtualnych tabel funkcji lub VTBL. VTBL składa się ze struktury wskaźników funkcji , których biblioteka systemowa może używać do komunikacji z serwerem lub klientem. Biblioteki serwera i klienta, OLESVR.DLL i OLECLI.DLL , zostały pierwotnie zaprojektowane do komunikowania się między sobą za pomocą komunikatu WM_DDE_EXECUTE .

OLE 1.0 później ewoluował, stając się architekturą dla komponentów oprogramowania, znaną jako Component Object Model (COM), a później DCOM .

Gdy obiekt OLE zostanie umieszczony w schowku lub osadzony w dokumencie, zarówno wizualna reprezentacja w natywnych formatach systemu Windows (takich jak mapa bitowa lub metaplik ) jest przechowywana, jak również bazowe dane w jego własnym formacie. Umożliwia to aplikacjom wyświetlanie obiektu bez ładowania aplikacji użytej do utworzenia obiektu, a także umożliwia edycję obiektu, jeśli zainstalowana jest odpowiednia aplikacja.

Object Packager , komponent OLE, dostarczane z systemem Windows 3.1 aż do Windows XP pozwala niebędącego obiektem OLE być „zapakowane”, więc to może być zintegrowany ze OLE klienta.

OLE 2.0

OLE 2.0 to kolejna ewolucja OLE, mająca wiele z tych samych celów, co wersja 1.0, ale została ponownie zaimplementowana na szczycie COM, zamiast bezpośrednio używać VTBL. Nowe funkcje to automatyzacja OLE , przeciąganie i upuszczanie , aktywacja w miejscu i ustrukturyzowane przechowywanie . Monikery wyewoluowały z nazw obiektów OLE 1 i zapewniły hierarchiczny system nazewnictwa obiektów i zasobów podobny do adresów URL lub URI , które zostały wynalezione niezależnie. System Windows połączył teraz dwie technologie obsługujące typ URL Moniker i schemat URL Moniker.

Niestandardowe kontrolki OLE

Niestandardowe kontrolki OLE zostały wprowadzone w 1994 roku jako zamiennik obecnie przestarzałych kontrolek rozszerzenia Visual Basic . Zamiast ich ulepszać, nowa architektura została oparta na OLE. W szczególności każdy kontener obsługujący OLE 2.0 może już osadzić niestandardowe kontrolki OLE, chociaż te kontrolki nie mogą reagować na zdarzenia, chyba że kontener obsługuje to. Niestandardowe kontrolki OLE są zwykle dostarczane w postaci biblioteki dołączanej dynamicznie z rozszerzeniem .ocx. W 1996 roku wszystkie interfejsy dla kontrolek (z wyjątkiem IUnknown) stały się opcjonalne, aby zmniejszyć rozmiar pliku kontrolek, dzięki czemu ładują się one szybciej; były one wówczas nazywane formantami ActiveX .

Szczegóły techniczne

Obiekty i kontenery OLE są zaimplementowane na modelu Component Object Model ; są to obiekty, które mogą implementować interfejsy w celu eksportowania ich funkcjonalności. Tylko interfejs IOleObject jest obowiązkowy, ale inne interfejsy mogą również wymagać zaimplementowania, jeśli wymagana jest funkcjonalność eksportowana przez te interfejsy.

Aby ułatwić zrozumienie tego, co następuje, należy wyjaśnić pewną terminologię. Status widoku obiektu określa, czy obiekt jest przezroczysty, nieprzezroczysty lub nieprzezroczysty z jednolitym tłem i czy obsługuje rysowanie z określonym aspektem. Witryna obiektu to obiekt reprezentujący położenie obiektu w jego kontenerze. Kontener obsługuje obiekt witryny dla każdego zawartego obiektu.

Poniżej znajduje się lista interfejsów pogrupowanych według obiektów, które zwykle muszą je zaimplementować. Interfejsy zwykle implementowane przez obiekt OLE są zwykle wywoływane przez kontener OLE i na odwrót. Zauważ, że na poniższej liście wcięcie oznacza dziedziczenie interfejsu. Wszystkie interfejsy bez wcięcia pochodzą od IUnknown .

Obiekt OLE

Obiekt danych
Po wdrożeniu umożliwia przesyłanie danych i powiadamianie o zmianach danych. Musi być zaimplementowany przez obiekty, które mają obsługiwać przeciąganie i upuszczanie, kopiowanie lub wklejanie ze schowka lub łączenie lub osadzanie w dokumencie zawierającym.
ObiektZSerwisem
Umożliwia dzwoniącemu poinformowanie obiektu OLE o swojej witrynie. Ta funkcjonalność jest również zapewniana przez OleObject , ale ObjectWithSite może być używany, gdy jest obsługiwana, jeśli OleObject nie jest używany do innych spraw.
OleCache
Umożliwia buforowanie prezentacji wizualnych z obiektu DataObject . Dzięki temu osadzony obiekt może przechowywać swoją reprezentację wizualną, dzięki czemu można go później wyświetlić bez konieczności uruchamiania aplikacji użytej do utworzenia obiektu.
Zwykle stosowana jest implementacja magazynowa.
OleCache2
Zapewnia bardziej szczegółową kontrolę nad buforowaniem.
Zwykle stosowana jest implementacja magazynowa.
OleCacheControl
Ten interfejs nie jest wywoływany przez kontener, ale wewnętrznie przez obiekt, aby umożliwić mu otrzymywanie powiadomień o tym, kiedy jego obiekt DataObject jest uruchomiony, co pozwala mu na subskrybowanie powiadomień o zmianach danych tego obiektu, a tym samym na prawidłową aktualizację buforowanej prezentacji .
Zwykle stosowana jest implementacja magazynowa.
OleDokument
Umożliwia obiektowi OLE obsługę wielu widoków jego danych, a także kilku powiązanych funkcji.
OleDocumentView
Obiekt dokumentu (obiekt, który implementuje OleDocument ) implementuje ten interfejs dla każdego widoku. Pozwala na ustawienie lokalizacji obiektu, zapytanie i ustawienie rozmiaru obiektu oraz pokazanie i aktywowanie go, a także niektórych powiązanych funkcji.
OleOkno
OleInPlaceActiveObject
Wywoływany przez najbardziej zewnętrzny kontener obiektu w celu interakcji z nim, gdy jest on aktywny, np. w celu przetworzenia kluczy akceleracyjnych w kolejce komunikatów kontenera, które są przeznaczone dla zawartego obiektu.
Obiekt OleInPlace
Wywoływany przez kontener, aby aktywować lub dezaktywować obiekt.
IOleInPlaceObjectWindowless
Obiekt bez okna to obiekt, który nie ma własnego okna, ale zamiast tego jest wyświetlany w oknie swojego kontenera. Jest używany przez kontener do przekazywania wiadomości odebranych przez okno kontenera, które są przeznaczone dla zawartego obiektu. Na przykład, jeśli mysz zostanie przesunięta nad okno, system Windows umieszcza komunikat przesunięcia myszy wraz ze współrzędnymi myszy w kolejce komunikatów okna. Jeśli to okno zawiera osadzone obiekty bez okien, wiadomość może być przekazana do takiego obiektu, jeśli współrzędne wskaźnika myszy znajdują się nad tym obiektem. Z podobnych powodów ten interfejs zapewnia również dostęp do interfejsu DropTarget obiektu .
OleLink
Umożliwia obiektowi obsługę łączenia, np. poprzez zezwolenie kontenerowi na ustawienie źródła połączonego obiektu.
Zwykle stosowana jest implementacja magazynowa.
OleObject
Prawdopodobnie najważniejszy interfejs dla obiektu OLE. Na przykład umożliwia kontenerowi poinformowanie obiektu o swojej lokalizacji, inicjalizację obiektu z danych, otwieranie i zamykanie go, wykonywanie zapytań i ustawianie rozmiaru obiektu, proszenie o powiadomienia na AdviseSink kontenera oraz wykonywanie zdefiniowanych obiektów jako "czasowniki" na dopełnieniu. Te czasowniki często zawierają „Open” lub „Edit”, ale mogą również zawierać inne czasowniki. Jeden z czasowników jest zdefiniowany jako czasownik główny i jest wykonywany, gdy użytkownik dwukrotnie kliknie obiekt.
Wyświetl obiekt
Umożliwia bezpośrednie rysowanie obiektu bez przekazywania obiektu DataObject do kontenera. W przypadku obiektów, które obsługują zarówno DataObject, jak i ten interfejs, podstawowa implementacja jest zwykle udostępniana.
WidokObiekt2
Dodatkowo umożliwia rozmówcy zapytanie o rozmiar obiektu.
ViewObjectEx
Dodano obsługę rysowania obiektów przezroczystych bez migotania, testowania trafień obiektów o nieregularnych kształtach i ustawiania rozmiaru obiektu.

Pojemnik OLE

IAdviseSink
Umożliwia realizatorowi otrzymywanie powiadomień o zapisaniu, zamknięciu lub zmianie nazwy obiektu, a także o zmianie jego danych lub prezentacji wizualnej.
IAdviseSink2
Dodatkowo umożliwia realizatorowi otrzymywanie powiadomień, gdy zmieni się źródło łącza obiektu OLE.
IAdviseSinkEx
Dodatkowo umożliwia realizatorowi otrzymywanie powiadomień, gdy zmieni się stan widoku obiektu OLE.
IOleClientSite
Interfejs ten pozwala dzwoniącemu uzyskać informacje o kontenerze i lokalizacji obiektu, a także zażądać zapisania obiektu, zmiany jego rozmiaru, wyświetlenia, ukrycia itd.
IOleDocumentSite
Pozwala dzwoniącemu poprosić o natychmiastową aktywację obiektu na tej stronie. Jeśli ten interfejs jest zaimplementowany, należy również zaimplementować IOleClientSite , IOleInPlaceSite i IAdviseSink .
IOleContainer
Ten interfejs umożliwia wywołującemu wyliczanie obiektów osadzonych w kontenerze lub znajdowanie takich obiektów według nazwy. Jest to przede wszystkim przydatne, jeśli kontener chce obsługiwać łącza do osadzonych obiektów.
IOleWindow
Okno interfejsu IOleInPlace
Umożliwia osadzonym obiektom negocjowanie miejsca na paski narzędzi w oknie kontenera.
IOleInPlaceFrame
Pozwala dzwoniącemu poprosić kontener o wstawienie elementów menu do pustego menu, które stanie się menu współpracy. Umożliwia również dzwoniącemu poproszenie kontenera o pokazanie lub ukrycie tego menu, pokazanie lub ukrycie okien dialogowych oraz przetworzenie kluczy akceleracyjnych odebranych przez zawarty obiekt przeznaczony dla kontenera.
IOleInPlaceSite
Jeśli kontener implementuje ten interfejs, umożliwia aktywację osadzonych obiektów w miejscu, tj. bez otwierania w osobnym oknie. Zapewnia dostęp do IOleInPlaceUIWindow kontenera .
IOleInPlaceSiteEx
Jeśli kontener implementuje ten interfejs, umożliwia osadzonym obiektom sprawdzenie, czy muszą zostać przerysowane podczas aktywacji lub dezaktywacji. Pozwala im również poprosić o aktywację interfejsu użytkownika.
IOleInPlaceSiteBez okien
Jeśli kontener chce obsługiwać osadzone obiekty bez okien, musi zapewnić funkcjonalność osadzonym obiektom, aby zastąpić funkcjonalność normalnie zapewnianą przez okno osadzonego obiektu. Na przykład ten interfejs umożliwia dostęp do kontekstu urządzenia okna kontenera, umożliwiając w ten sposób osadzonemu obiektowi rysowanie w oknie kontenera.
IOleUILinkContainer
Zawiera metody używane w standardowych oknach dialogowych OLE, które zarządzają połączonymi obiektami, do aktualizowania połączonych obiektów w kontenerze lub do wykonywania zapytań i zmiany ich źródeł. Używany w oknach dialogowych „Linki”, „Zmień źródło”, „Aktualizuj łącza” i „Właściwości obiektu”.
Informacje o IOleUILink
Dodatkowo umożliwia oknom dialogowym zapytanie, kiedy połączone obiekty zostały ostatnio zaktualizowane i czy zostało to zrobione automatycznie, czy ręcznie.
IOleUIObjInfo
Zawiera metody potrzebne w oknie dialogowym „Właściwości obiektu”. Na przykład, jeśli użytkownik otworzy okno dialogowe „Właściwości obiektu” i poprosi o przekonwertowanie obiektu na inny typ, wywoływana jest metoda tego interfejsu.
IOleUndoManager
Zapewnia scentralizowaną usługę cofania zarówno samego kontenera, jak i osadzonych obiektów. Po wykonaniu akcji, którą można cofnąć , IOleUndoUnit jest tworzony i dodawany do IOleUndoManager

Inne

IDataAdviseHolder
Metody IDataObject, które odnoszą się do powiadomień o zmianie danych, można zaimplementować, wywołując metody tego interfejsu.
Zwykle stosowana jest implementacja magazynowa.
IOleAdviseHolder
Metody IOleObject, które odnoszą się do powiadomień, można zaimplementować, wywołując metody tego interfejsu.
Zwykle stosowana jest implementacja magazynowa.
IDropSource
Zaimplementowane przez obiekty, które można przeciągać, tj. które mogą być źródłem operacji przeciągania i upuszczania. Po zaimplementowaniu umożliwia obiektowi rysowanie efektów przeciągania i upuszczania oraz określanie, kiedy obiekt jest upuszczany lub operacja przeciągania i upuszczania jest anulowana.
IDropTarget
Zaimplementowane przez obiekty, które akceptują upuszczone obiekty, tj. które mogą być celem operacji przeciągania i upuszczania. Po zaimplementowaniu pozwala celowi określić, czy upuszczony obiekt zostanie zaakceptowany i co stanie się z obiektem po jego upuszczeniu.
IOleCommandTarget
Mogą być implementowane przez obiekty (obiekty OLE, kontenery OLE i inne obiekty), które chcą obsługiwać niektóre standardowe polecenia. Umożliwia wywołującym zapytanie, czy polecenia są obsługiwane, i wykonywanie poleceń. Polecenia, które obiekt może zwykle chcieć zaimplementować, mogą obejmować takie elementy, jak „usuń”, „wytnij”, „kopiuj”, „wklej”, „cofnij”, „znajdź”, „drukuj”, „zapisz”, „powiększanie” i wkrótce. Obecnie zdefiniowano 58 standardowych poleceń, które obejmują polecenia powszechnie używane przez oprogramowanie biurowe, przeglądarki internetowe i podobne aplikacje.
IOleUndoUnit
Reprezentuje akcję, którą można cofnąć. Zawiera wszystkie informacje niezbędne do cofnięcia akcji. Jest tworzony przez obiekty i kontenery, dzięki czemu do IOleUndoManager kontenera można dodać akcje, które można cofnąć .
IOleParentUndoUnit
Pozwala jednostce cofania zawierać inne jednostki cofania. W istocie pozwala to jednostce cofania działać jako stos cofania, grupując jednostki cofania. Na przykład, jeśli zostanie uruchomione makro, wszystkie akcje wykonywane przez makro, których można cofnąć, mogą być zgrupowane w jednej jednostce cofania.
IOleWindow
Ten interfejs reprezentuje okno kontenera lub zawartego obiektu. Umożliwia dzwoniącym uzyskanie uchwytu okna i przełączanie funkcji pomocy kontekstowej. Gdy funkcja pomocy kontekstowej jest włączona, wskaźnik myszy zwykle zmienia się w strzałkę ze znakiem zapytania, wskazującą, że kliknięcie elementu interfejsu użytkownika spowoduje otwarcie okna pomocy.

Konkurencja

Technologia OpenDoc próbowała konkurować z OLE. Niektórzy konkurenci Microsoftu uważali OpenDoc za bardziej niezawodny i łatwiejszy w użyciu; jednak OpenDoc ma pewne znane problemy . OpenDoc umożliwiał użytkownikom przeglądanie i edytowanie informacji w różnych aplikacjach, bezpośrednio konkurując z zastrzeżonym standardem OLE firmy Microsoft. W 1993 roku niektórzy konkurenci Microsoftu utworzyli konsorcjum o nazwie Component Integration Laboratories (CIL) w celu opracowania OpenDoc jako otwartego standardu łączenia i osadzania między platformami.

Microsoft wymagał zgodności OLE jako warunku certyfikacji Microsoft zgodności aplikacji z Windows 95 . Microsoft początkowo ogłosił, że aplikacje używające OpenDoc zostaną uznane za kompatybilne z OLE i otrzymają certyfikat dla Windows 95. Microsoft później cofnął decyzję i powiedział, że aplikacje używające OpenDoc mogą w ogóle nie otrzymać certyfikatu. Microsoft wstrzymywał specyfikacje i debugowane wersje OLE do czasu opublikowania konkurencyjnych aplikacji.

Interoperacyjność

Korzystanie z obiektów OLE ogranicza interoperacyjność, ponieważ obiekty te nie są powszechnie obsługiwane w programach do przeglądania lub edycji plików poza systemem Microsoft Windows (np. osadzanie innych plików wewnątrz pliku, takich jak tabele lub wykresy z aplikacji arkusza kalkulacyjnego w dokumencie tekstowym lub plik prezentacji). Jeśli oprogramowanie obsługujące obiekt OLE nie jest dostępne, obiekt jest zwykle zastępowany obrazem (reprezentacja obiektu w postaci mapy bitowej) lub w ogóle nie jest wyświetlany.

Zobacz też

Bibliografia

Zewnętrzne linki

  • ripOLE - wyodrębnia załączniki z dokumentów OLE
  • Tło OLE z witryny docs.microsoft.com