Korzystanie z wczesnego i późnego wiązania w automatyzacji

Zakończono świadczenie pomocy technicznej dla pakietu Office 2003

Firma Microsoft zakończyła świadczenie pomocy technicznej dla pakietu Office 2003 8 kwietnia 2014. Ta zmiana wpłynęła na Twoje aktualizacje oprogramowania i opcje zabezpieczeń. Dowiedz się, co to oznacza dla Ciebie i jak zapewnić sobie kontynuację ochrony.

Streszczenie
Jak powiązanie z serwerem automatyzacji może wpływać na wiele aspektów programu, takich jak wydajność, elastyczność i naprawialność.

W niniejszym artykule wyjaśniono typy wiązań dostępnych dla klientów automatyzacji i podsumowano zalety oraz wady poszczególnych metod.
Więcej informacji
Automatyzacja jest procesem, w którym składnik oprogramowania komunikuje się z innym składnikiem oprogramowania i/lub kontroluje go przy użyciu modelu COM (Component Object Model) firmy Microsoft. Stanowi podstawę większości procesów komunikacji między składnikami, używana jest w takich językach, jak Visual Basic lub Visual Basic for Applications, i obecnie wchodzi w skład większości programów.

Pod względem historycznym obiekt automatyzacji (Automation) jest dowolnym obiektem obsługującym interfejs IDispatch. Ten interfejs umożliwia klientom wywoływanie metod i właściwości w czasie wykonywania, bez konieczności dokładnej identyfikacji obiektu, z którym komunikują się w czasie projektowania; proces ten zwany jest późnym wiązaniem. Obecnie termin Obiekt automatyzacji można jednak stosować w praktyce w odniesieniu do dowolnego obiektu COM, a nawet tych, które nie obsługują interfejsu IDispatch (i tym samym nie obsługą późnego wiązania). W niniejszym artykule przyjęto założenie, że automatyzowany obiekt obsługuje obie metody wiązania.

Co to jest wiązanie?

Wiązanie jest procesem dopasowania wywołań funkcji napisanych przez programistę do rzeczywistego kodu (wewnętrznego lub zewnętrznego) implementującego daną funkcję. Ta operacja jest wykonywana podczas kompilowania aplikacji, a wszystkie funkcje wywoływane w kodzie muszą być powiązane przed wykonaniem kodu.

Aby zrozumieć ten proces, należy postrzegać „wiązanie” w kategoriach publikowania książki. Wyobraźmy sobie, że kod jest podobny do pisanej właśnie książki, w której treść określonego akapitu jest następująca: „zobacz rozdział 12, str. x, aby uzyskać więcej informacji” . Nie można ustalić numeru strony aż do ukończenia książki, dlatego przed przygotowaniem ostatecznej treści akapitu należy powiązać wszystkie strony książki i wstawić do akapitu poprawny numer strony. Należy poczekać, aż książka będzie „powiązana” , aby było możliwe odwoływanie się do innych części książki.

Wiązanie oprogramowania działa podobnie. Projektowany kod składa się z części, które należy połączyć, aby umożliwić „odczytanie” kodu. Wiązanie polega na wymianie nazw funkcji na adresy pamięci (lub przesunięcia pamięci, mówiąc ściślej), do których kod będzie „przeskakiwać” podczas wywołania funkcji. W przypadku obiektów COM, adres jest przesunięciem pamięci w tabeli wskaźników (zwanej v-table) przechowywanej przez obiekt. Funkcja COM jest wiązana za pośrednictwem tabeli v-table.

Struktura obiektu COM jest prosta. Jeżeli kod zawiera odwołanie do obiektu, przechowuje pośredni wskaźnik do pierwszego wiersza tabeli v-table. Tabela v-table jest tablicą adresów pamięci zawierającą wpisy poszczególnych funkcji, które można wywołać w odniesieniu do danego obiektu. Aby wywołać trzecią funkcję w odniesieniu do obiektu COM, należy przejść w dół o trzy wpisy w tabeli, a następnie przeskoczyć do podanej lokalizacji pamięci. Spowoduje to wykonanie kodu dla danej funkcji i, po zakończeniu, powrót do lokalizacji, w której można wykonać następny wiersz kodu.
+-[kod]-------------+  +.................................[Obiekt COM]...+|                   |  : +-------------+                                :|Set obj = Nic -----|--->|wskaźnik obj |                                :|                   |  : +-|-----------+                                :+-------------------+  :   |   +-----------------+                      :                       :   +-->|wskaźnik  v-table|                      :                       :       +--|--------------+                      :                       :          |                                     :                       :          |  +----------------------------+     :                       :  (3. )   |  | Funkcja 1- wskaźnik adresu |     :                       : (przes.) |  +----------------------------+     :                       :          |  | Funkcja 2- wskaźnik adresu |     :                       :          |  +----------------------------+     :                       :          +->| Funkcja 3- wskaźnik adresu |     :                       :             +----------------------------+     :                       +................................................+				
W powyższym przykładzie przedstawiono sekwencję zdarzeń podczas zwalniania obiektu COM. Wszystkie obiekty COM dziedziczą po interfejsie IUnknown, dlatego trzy początkowe wpisy w tabeli są metodami związanymi z interfejsem IUnknown. Jeżeli konieczne jest zwolnienie obiektu, kod wywołuje trzecią funkcję w tabeli v-table (IUnknown::Release).

Na szczęście ta operacja jest wykonywana w tle przez program Visual Basic. Programista korzystający z programu Visual Basic nigdy nie musi bezpośrednio obsługiwać tabeli v-table. Ta struktura wiązania obowiązuje jednak w przypadku wszystkich obiektów COM i koniecznie należy zapoznać się z nią, aby zrozumieć mechanizm wiązania.

Wczesne wiązanie

W powyższym przykładzie przedstawiono tzw. wczesne wiązanie (tabelę v-table). W przypadku wszystkich obiektów COM ta forma wiązania występuje zawsze wówczas, gdy wywoływany jest interfejs IUnknown obiektu COM. Co jednak z innymi funkcjami obiektu? Jak wywołać metodę Refresh lub właściwość Parent? Te niestandardowe funkcje zazwyczaj są unikatowe dla obiektu. Jeżeli nie można założyć ich lokalizacji w tabeli v-table, jak odnaleźć adresy wymagane do wywołania funkcji?

Odpowiedź jest oczywiście zależna od tego, czy znany jest wygląd tabeli v-table obiektu. Jeżeli tak, można wykonać proces wczesnego wiązania dla niestandardowych metod obiektu taki sam, jak dla metod interfejsu IUnknown. Takie jest ogólne znaczenie „wczesnego wiązania” .

Aby użyć wczesnego wiązania w odniesieniu do obiektu, należy poznać wygląd jego tabeli v-table. W programie Visual Basic można wykonać tę operację, dodając odwołanie do biblioteki typów opisującej obiekt, jego interfejs (tabela v-table) i wszystkie funkcje, które można wywoływać w odniesieniu do danego obiektu. Po wykonaniu tej operacji można deklarować go jako obiekt określonego typu, a następnie ustawić ten obiekt i korzystać z niego przy użyciu tabeli v-table. Na przykład, jeżeli konieczna jest automatyzacja programu Microsoft Office Excel przy użyciu wczesnego wiązania, należy dodać odwołanie do biblioteki „Microsoft Excel 8.0 Object Library” z okna dialogowego Project|References (Projekt|Odwołania), a następnie zadeklarować swoją zmienną jako zmienną typu „Excel.Application” . Po wykonaniu tej operacji wszystkie wywołania do tej zmiennej obiektu będą wczesnym wiązaniem:
' Set reference to 'Microsoft Excel 8.0 Object Library' in' the Project|References dialog (or Tools|References for VB4 or VBA).' Declare the object as an early-bound object  Dim oExcel As Excel.Application  Set oExcel = CreateObject("Excel.Application")' The Visible property is called via the v-table  oExcel.Visible = True				
Ta metoda jest zazwyczaj skuteczna, jednak co zrobić, jeżeli w czasie projektowania obiekt, który będzie używany, nie jest znany? Na przykład, co jeżeli konieczne jest komunikowanie się z wieloma wersjami programu Excel lub z całkowicie nieznanym obiektem?

Późne wiązanie

W modelu COM uwzględniono interfejs IDispatch. Obiekty implementujące interfejs IDispatch są zwane obiektami z interfejsem dispinterface (jeżeli obsługują tylko ten interfejs) lub podwójnym interfejsem (jeżeli mają również interfejs niestandardowy obsługujący wczesne wiązanie). W przypadku interfejsu IDispatch wykorzystywane jest „późne wiązanie” klientów, ponieważ określona wywoływana właściwość lub metoda jest określana w czasie wykonywania przy użyciu metod interfejsu IDispatch umożliwiających ich lokalizację. Rozważmy ponownie przedstawiony przykład dotyczący książki, postrzegając go jako przypis dolny kierujący użytkownika do spisu treści, gdzie musi on sprawdzić numer strony w „czasie czytania” , zamiast znaleźć go od razu w tekście.

Wyjątkowe zalety interfejsu przejawiają się poprzez kontrolę dwóch funkcji: GetIDsOfNames i Invoke. Pierwsza mapuje nazwy funkcji (ciągi) na identyfikator (zwany dispid) reprezentujący daną funkcję. Po ustaleniu identyfikatora funkcji można wywołać ją przy użyciu funkcji Invoke. Ta forma wywołania metody jest zwana „późnym wiązaniem” .

W tym przypadku w programie Visual Basic metoda wiązania obiektu jest również określana przez deklarację obiektu. Deklarowanie zmiennej obiektu jako „Object” w rzeczywistości oznacza poinformowanie programu Visual Basic o konieczności użycia interfejsu IDispatch, a więc późnego wiązania:
' No reference to a type library is needed to use late binding.' As long as the object supports IDispatch, the method can ' be dynamically located and invoked at run-time.' Declare the object as a late-bound object  Dim oExcel As Object  Set oExcel = CreateObject("Excel.Application")' The Visible property is called via IDispatch  oExcel.Visible = True				
Jak widać, pozostała część kodu jest taka sama. Jedyną różnicą między wczesnym a późnym wiązaniem (w kategoriach programowanego kodu) jest deklaracja zmiennej.

Należy koniecznie zaznaczyć, że podstawowym aspektem „późnego wiązania” jest wywołanie funkcji, a nie sposób wywołania. Uwzględniając powyższą dyskusję dotyczącą ogólnych aspektów wiązania, należy zauważyć, że interfejs IDispatch jest „wczesnym wiązaniem” , tzn. program Visual Basic wykonuje wywołanie w celu ustawienia właściwości Visible za pośrednictwem wpisu tabeli v-table (IDispatch::Invoke), tak jak w przypadku dowolnego wywołania obiektów COM. Obiekt COM jest zobowiązany do przekazania wywołania do odpowiedniej funkcji w celu wyświetlenia okna programu Excel. Ten mechanizm umożliwia kompilację klienta programu Visual Basic (tzn. wiązanie z prawidłowym adresem funkcji), jednak wciąż funkcja, która w rzeczywistości wykona to zadnie, nie jest znana.

Wiązanie z identyfikatorem dispid

Niektórzy klienci automatyzacji (przede wszystkim MFC i Visual Basic 3.0, ale również Visual Basic 5.0 i 6.0 w aspekcie formantów ActiveX) używają hybrydowej formy późnego wiązania, zwanej wiązaniem z identyfikatorem dispid. Jeżeli obiekt COM jest znany w czasie projektowania, można buforować identyfikatory wywoływanych funkcji i przekazywać je bezpośrednio do funkcji IDispatch::Invoke bez konieczności wywoływania funkcji GetIDsOfNames w czasie wykonywania. Umożliwia to znaczne zwiększenie wydajności, ponieważ zamiast dwóch wywołań obiektów COM dla każdej funkcji wymagane jest tylko jedno wywołanie.

Wiązanie z identyfikatorem dispid nie jest opcją, którą można wybrać w programie Visual Basic w wersji 5.0 lub 6.0. Jest ono używane w przypadku obiektów, które mają odwołania w bibliotece typów, jednak nie zawierają niestandardowego interfejsu (tzn. obiektów, które mają tylko interfejs dispinterface), i dla zespolonych formantów ActiveX, jednak zgodnie z ogólną regułą program Visual Basic zawsze używa wczesnego wiązania w okolicznościach, w których zazwyczaj jest używane wiązanie z identyfikatorem dispid.

Której formy wiązania należy użyć?

Odpowiedź na to pytanie jest zależna zarówno od projektu, jak i innych czynników. Firma Microsoft zaleca wczesne wiązanie w większości wypadków. Wybór późnego wiązania może być jednak uzasadniony.

Wczesne wiązanie to preferowana metoda. Zapewnia największą wydajność, ponieważ aplikacja jest wiązana bezpośrednio z adresem wywoływanej funkcji, a wyszukiwanie w czasie wykonywania nie jest związane z dodatkowym obciążeniem. W aspekcie ogólnej szybkości wykonania jest co najmniej dwukrotnie szybsza od późnego wiązania.

Wczesne wiązanie zapewnia również zabezpieczenia typu. Po ustawieniu odwołania do biblioteki typów składników program Visual Basic zapewnia obsługę technologii IntelliSense, ułatwiając poprawne programowanie kodu poszczególnych funkcji. Ponadto program Visual Basic ostrzega, jeżeli typ danych parametru lub zwracanej wartości jest niepoprawny, pozwalając oszczędzić znaczną ilość czasu na etapie programowania lub debugowania kodu.

Późne wiązanie jest jednak użyteczne w sytuacjach, w których interfejs obiektu nie jest znany w czasie projektowania. Jeżeli aplikacja usiłuje komunikować się z wieloma nieznanymi serwerami lub musi wywoływać funkcje według nazwy (na przykład przy użyciu funkcji CallByName programu Visual Basic 6.0), należy użyć późnego wiązania. Późne wiązanie umożliwia również obejście problemów związanych ze zgodnością między wieloma wersjami składnika, który niepoprawnie zmodyfikował lub zaadaptował swój interfejs w różnych wersjach.

Uwzględniając zalety wczesnego wiązania, można uznać je za optymalny wybór w okolicznościach umożliwiających zastosowanie tej metody.

Zachowanie zgodności w różnych wersjach

Jeżeli używany składnik nie jest redystrybuowany z pakietem instalacyjnym programisty i nie można ustalić, z którą wersją będzie nawiązywana komunikacja w czasie wykonywania, należy zwrócić szczególną uwagę na wczesne wiązanie z interfejsem zgodnym ze wszystkimi wersjami składnika lub (w niektórych wypadkach) użyć późnego wiązania w celu wywołania metody istniejącej w określonej wersji i bezpiecznego zgłoszenia niepowodzenia, jeżeli ta metoda nie istnieje w wersji zainstalowanej w systemie klienckim.

Aplikacje pakietu Microsoft Office są dobrym przykładem serwerów COM tego typu. Aplikacje pakietu Office zazwyczaj rozszerzają swoje interfejsy w celu dodania nowych funkcji lub skorygowania usterek poprzednich wersji. Jeżeli konieczna jest automatyzacja aplikacji pakietu Office, zalecane jest wczesne wiązanie z najstarszą wersją produktu, która może być zainstalowana w systemie klienckim. Na przykład, jeżeli konieczna jest automatyzacja programów Excel 95, Excel 97, Excel 2000 i Excel 2002, należy użyć biblioteki typów dla programu Excel 95 (XL5en32.olb), aby zapewnić zgodność ze wszystkimi trzema wersjami.

Aplikacje pakietu Office potwierdzają również, że w przypadku modeli obiektów z dużą liczbą interfejsów mogą występować ograniczenia organizowania na niektórych platformach. Aby umożliwić optymalne funkcjonowanie kodu na wszystkich platformach, należy korzystać z interfejsu IDispatch. Aby uzyskać więcej informacji na temat zachowania zgodności podczas pracy z aplikacjami pakietu Office, kliknij następujący numer artykułu, aby wyświetlić ten artykuł z bazy wiedzy Microsoft Knowledge Base:
247579 Należy używać wiązania z identyfikatorem DISPID do automatyzowania aplikacji pakietu Office zawsze wówczas, gdy jest to możliwe
Materiały referencyjne
Aby uzyskać więcej informacji dotyczących modelu COM, tabel v-table i korzystania z automatyzacji, przeczytaj następujące książki:
Rogerson, Dale, Inside COM, MSPRESS, ISBN: 1-57231-349-8.

Curland, Matt, Advanced Visual Basic 6, DevelopMentor, 0201707128.
OFF2003 OFF2007
Właściwości

Identyfikator artykułu: 245115 — ostatni przegląd: 01/03/2008 19:59:00 — zmiana: 7.1

Microsoft Office Ultimate 2007, Microsoft Office Enterprise 2007, Microsoft Office Professional 2007, Microsoft Office Professional Plus 2007, Microsoft Office Standard 2007, Office 2007 dla Uzytkownikow Domowych, Microsoft Office Basic 2007, Microsoft Office Standard Edition 2003, Microsoft Office XP Developer Edition, Microsoft Office 2000 Developer Edition, Microsoft Visual Basic 5.0 Professional Edition, Microsoft Visual Basic 6.0 Professional Edition, Microsoft Visual Basic 5.0 Enterprise Edition, Microsoft Visual Basic 6.0 Enterprise Edition

  • kbinfo kbautomation KB245115
Opinia