Informacje o dynamicznej wymianie danych
System Windows udostępnia kilka metod przesyłania danych między aplikacjami. Jedną z metod jest użycie protokołu Dynamicznej wymiany danych (DDE). Protokół DDE to zestaw komunikatów i wytycznych. Wysyła komunikaty między aplikacjami, które udostępniają dane i używają pamięci udostępnionej do wymiany danych między aplikacjami. Aplikacje mogą używać protokołu DDE do jednorazowego transferu danych i ciągłej wymiany, w której aplikacje wysyłają aktualizacje do siebie, gdy nowe dane staną się dostępne.
System Windows obsługuje również Bibliotekę Zarządzania Dynamiczną Wymianą Danych (DDEML). DDEML to biblioteka biblioteki linków dynamicznych (DLL), której aplikacje mogą używać do udostępniania danych. DDEML udostępnia funkcje i komunikaty, które upraszczają zadanie dodawania funkcji DDE do aplikacji. Zamiast wysyłać, publikować i przetwarzać komunikaty DDE bezpośrednio, aplikacja używa funkcji DDEML do zarządzania konwersacjami DDE. (Konwersacja DDE to interakcja między aplikacjami klienta i serwera).
DDEML zapewnia również funkcję zarządzania ciągami i danymi udostępnianymi przez aplikacje DDE. Zamiast używać atomów i wskaźników do udostępnionych obiektów pamięci, aplikacje DDE tworzą i wymieniają uchwyty ciągów znaków, które identyfikują te ciągi, oraz uchwyty danych, które identyfikują obiekty pamięciowe. DDEML umożliwia również aplikacji serwera zarejestrowanie nazw usług, które obsługuje. Nazwy są emitowane do innych aplikacji w systemie, które mogą używać nazw do nawiązywania połączenia z serwerem. Ponadto DDEML zapewnia zgodność między aplikacjami DDE, zmuszając ich do implementowania protokołu DDE w spójny sposób.
Istniejące aplikacje korzystające z protokołu DDE opartego na komunikatach są w pełni zgodne z tymi, które korzystają z DDEML. Oznacza to, że aplikacja korzystająca z funkcji DDE opartej na komunikatach może nawiązywać konwersacje i wykonywać transakcje z aplikacjami korzystającymi z DDEML. Ze względu na wiele zalet DDEML nowe aplikacje powinny używać jej zamiast komunikatów DDE. Aby użyć elementów interfejsu API DDEML, należy dołączyć plik nagłówka DDEML do plików źródłowych, połączyć się z biblioteką DDEML i upewnić się, że biblioteka DDEML dynamic-link znajduje się w ścieżce wyszukiwania systemu.
W tej sekcji omówiono następujące tematy.
- protokołu wymiany danych dynamicznych
- Zastosowania dynamicznej wymiany danych w systemie Windows
- Dynamicznej wymiany danych z punktu widzenia użytkownika
- Pojęcia dotyczące dynamicznej wymiany danych
- dynamiczne komunikaty wymiany danych — omówienie
- dynamiczny przepływ komunikatów wymiany danych
- funkcje pakowania parametrów
- Dynamiczna wymiana danych i podszywanie się
Protokół dynamicznej wymiany danych
Ponieważ system Windows ma architekturę opartą na komunikatach, przekazywanie komunikatów jest najbardziej odpowiednią metodą automatycznego przesyłania informacji między aplikacjami. Jednak komunikaty zawierają tylko dwa parametry (wParam i lParam) do przekazywania danych. W związku z tym te parametry muszą odnosić się pośrednio do innych fragmentów danych, gdy między aplikacjami przekazywana jest więcej niż kilka słów informacji. Protokół DDE dokładnie definiuje, jak aplikacje powinny używać parametrów wParam i lParam do przekazywania większych fragmentów danych za pomocą globalnych atomów i uchwytów pamięci współdzielonej. Protokół DDE ma określone reguły przydzielania i usuwania globalnych atomów i obiektów pamięci udostępnionej.
Atom globalny to odwołanie do ciągu znaków. W protokole DDE atomy identyfikują aplikacje wymieniające dane, charakter wymienianych danych i same elementy danych. Aby uzyskać więcej informacji na temat atomów, zobacz About Atoms.
Używane do dynamicznej wymiany danych systemu Windows
Funkcja DDE jest najbardziej odpowiednia w przypadku wymiany danych, które nie wymagają ciągłej interakcji z użytkownikiem. Zazwyczaj aplikacja udostępnia użytkownikowi metodę ustanawiania połączenia między aplikacjami wymieniającym dane. Po ustanowieniu tego linku aplikacje wymieniają dane bez dalszego zaangażowania użytkownika.
Funkcja DDE może służyć do implementowania szerokiej gamy funkcji aplikacji — na przykład:
- Łączenie z danymi w czasie rzeczywistym, takimi jak aktualizacje na giełdzie, instrumenty naukowe lub kontrola procesów.
- Tworzenie złożonych dokumentów, takich jak dokument przetwarzania wyrazów, który zawiera wykres utworzony przez aplikację graficzną. Przy użyciu funkcji DDE wykres zmieni się po zmianie danych źródłowych, podczas gdy pozostała część dokumentu pozostaje taka sama.
- Wykonywanie zapytań dotyczących danych między aplikacjami, takich jak arkusz kalkulacyjny wykonujący zapytanie dotyczące bazy danych dla kont, które upłynął termin płatności.
Dynamiczna wymiana danych z punktu widzenia użytkownika
W poniższym przykładzie pokazano, jak dwie aplikacje DDE mogą współpracować, jak widać z punktu widzenia użytkownika.
Użytkownik arkusza kalkulacyjnego chce użyć programu Microsoft Excel do śledzenia ceny konkretnej akcji na Nowojorskiej Giełdzie Papierów Wartościowych. Użytkownik ma aplikację o nazwie Quote, która z kolei ma dostęp do danych NYSE. Konwersacja DDE między programem Excel i Quote odbywa się w następujący sposób:
- Użytkownik inicjuje konwersację, podając nazwę aplikacji (cytat), która będzie dostarczać dane i konkretny temat zainteresowania (NYSE). Wynikowa konwersacja DDE służy do żądania ofert dotyczących określonych zapasów.
- Program Excel przesyła nazwy aplikacji i tematów do wszystkich aplikacji DDE, które są aktualnie uruchomione w systemie. Cytat odpowiada, ustanawiając rozmowę z programem Excel na temat tematu NYSE.
- Użytkownik może następnie utworzyć formułę arkusza kalkulacyjnego w komórce, która żąda automatycznego zaktualizowania arkusza kalkulacyjnego za każdym razem, gdy określona oferta giełdowa ulegnie zmianie. Na przykład użytkownik może zażądać automatycznej aktualizacji za każdym razem, gdy nastąpi zmiana ceny sprzedaży akcji ZAXX, określając następującą formułę programu Excel: ='Cytat'|' NYSE'! ZAXX
- Użytkownik może w dowolnym momencie zakończyć automatyczną aktualizację notowania akcji ZAXX. Inne linki danych, które zostały ustanowione oddzielnie (na przykład dla ofert dla innych akcji) nadal będą aktywne w ramach tej samej konwersacji NYSE.
- Użytkownik może również zakończyć całą konwersację między programem Excel i cytatem w temacie NYSE, aby nie można było ustanowić żadnych konkretnych linków do danych dotyczących tego tematu bez inicjowania nowej konwersacji.
Pojęcia dotyczące dynamicznej wymiany danych
W poniższych sekcjach opisano ważne pojęcia i terminologię, które są kluczem do zrozumienia dynamicznej wymiany danych.
- Klienta, Serwera i Konwersacji
- Nazwy aplikacji, tematów i elementów
- Temat Systemu
- trwałe łącza danych
- Atomy i obiekty pamięci udostępnionej
Klient, serwer i konwersacja
Mówi się, że dwie aplikacje uczestniczące w DDE są zaangażowane w konwersację DDE. Aplikacja, która inicjuje konwersację, to aplikacja kliencka DDE; aplikacja odpowiadająca klientowi jest aplikacją serwera DDE. Aplikacja może jednocześnie prowadzić kilka konwersacji, działając jako klient w niektórych i jako serwer w innych.
Konwersacja DDE odbywa się między dwoma oknami, po jednym dla każdej z uczestniczących aplikacji. Okno może być głównym oknem aplikacji; okno skojarzone z określonym dokumentem, tak jak w aplikacji interfejsu wielodokumentowego (MDI); lub ukryte (niewidoczne) okno, którego jedynym celem jest przetwarzanie komunikatów DDE.
Ponieważ konwersacja DDE jest identyfikowana przez parę uchwytów okien zaangażowanych w konwersację, żadne okno nie powinno być zaangażowane w więcej niż jedną rozmowę z tym samym oknem. Aplikacja kliencka lub aplikacja serwera musi podać inne okno dla każdej konwersacji z określonym serwerem lub aplikacją kliencką.
Aplikacja może zapewnić, że para okien klienta i serwera nigdy nie jest zaangażowana w więcej niż jedną konwersację, tworząc ukryte okno dla każdej konwersacji. Jedynym celem tego okna jest przetwarzanie komunikatów DDE.
Nazwy aplikacji, tematu i elementów
Protokół DDE identyfikuje jednostki danych przekazywanych między klientem a serwerem z trzy-poziomową hierarchią aplikacji, tematu i nazw elementów.
Każda konwersacja DDE jest unikatowo definiowana przez nazwę i temat aplikacji. Na początku konwersacji DDE klient i serwer określają nazwę i temat aplikacji. Nazwa aplikacji jest zwykle nazwą aplikacji serwera. Na przykład gdy program Excel działa jako serwer w konwersacji, nazwa aplikacji to Excel.
Temat DDE to ogólna klasyfikacja danych, w ramach której podczas konwersacji może być "omówionych" (wymienianych) wiele elementów danych. W przypadku aplikacji, które działają na dokumentach opartych na plikach, temat jest zwykle nazwą pliku. W przypadku innych aplikacji temat jest nazwą specyficzną dla aplikacji.
Ponieważ okno klienta i serwera obsługuje razem konwersację DDE, nazwa aplikacji i temat definiujący konwersację nie mogą zostać zmienione w trakcie konwersacji.
Element danych DDE to informacje związane z tematem konwersacji wymienianym między aplikacjami. Wartości elementu danych można przekazać z serwera do klienta lub od klienta do serwera. Dane mogą być przekazywane za pomocą dowolnego standardowego formatu schowka lub zarejestrowanego formatu schowka. Specjalny, zarejestrowany format o nazwie Link identyfikuje element w konwersacji DDE. Aby uzyskać więcej informacji na temat formatów schowka, zobacz Schowek.
Temat systemowy
Aplikacje powinny wspierać wątek systemowy w każdym momencie. Ten temat zawiera kontekst informacji, które mogą być przedmiotem ogólnego zainteresowania innej aplikacji.
Wartości elementów danych muszą być renderowane w formacie schowka CF_TEXT. Poszczególne elementy wartości pozycji w temacie systemowym muszą być rozdzielane znakami tabulacji. W poniższej tabeli przedstawiono niektóre elementy tematu systemowego.
Przedmiot | Opis |
---|---|
Formaty | Rozdzielana tabulatorami lista formatów schowka, które może renderować aplikacja. Zazwyczaj formaty CF_ są wyświetlane z "CF_" częścią nazw usuniętą (na przykład CF_TEXT jest wyświetlane jako "TEXT"). |
Pomoc | Tekst, który krótko wyjaśnia, jak używać serwera DDE. |
Komunikat zwrotny | Szczegóły wspierające ostatnio używanego komunikatu WM_DDE_ACK. Ten element jest przydatny, gdy wymagane są więcej niż osiem bitów danych zwracanych przez aplikację. |
Stan | Wskazanie bieżącego stanu aplikacji. Gdy serwer otrzyma komunikat WM_DDE_REQUEST dla tego elementu tematu systemowego, powinien on odpowiedzieć, publikując komunikat WM_DDE_DATA z ciągiem zawierającym odpowiednio wartość Zajęty lub Gotowy. |
SysItems | Lista elementów tematów systemowych, które obsługuje aplikacja. |
ListaElementówTematu | Podobnie jak w elemencie SysItems, z tą różnicą, że lista TopicItemList powinna być obsługiwana dla każdego tematu innego niż temat systemowy. Umożliwia to przeglądanie elementów obsługiwanych w dowolnym temacie. Jeśli nie można wyliczyć elementów, ten element powinien zawierać tylko element "TopicItemList". |
Tematy | Lista tematów, które aplikacja obsługuje obecnie; ta lista może się różnić od chwili do chwili. |
Trwałe łącza danych
Po rozpoczęciu konwersacji DDE klient może ustanowić jeden lub więcej stałych łączy danych z serwerem. Link danych to mechanizm komunikacji, za pomocą którego serwer powiadamia klienta za każdym razem, gdy wartość określonego elementu danych ulegnie zmianie. Link danych jest trwały w tym sensie, że ten proces powiadomień będzie kontynuowany do momentu zakończenia linku danych lub samej konwersacji DDE.
Istnieją dwa rodzaje stałych łączy danych DDE: ciepłe i gorące. W ciepłym połączeniu danych serwer powiadamia klienta, że wartość pozycji danych się zmieniła, ale serwer nie wysyła wartości danych do klienta, dopóki klient nie zażąda wartości. W gorącym linku danych serwer natychmiast wysyła zmienioną wartość do klienta.
Aplikacje obsługujące ciepłe lub gorące łącza danych zazwyczaj oferują polecenie Copy lub Wklej łącze w menu Edytuj, aby umożliwić użytkownikowi ustanawianie linków między aplikacjami.
Atomy i obiekty pamięci udostępnionej
Niektóre argumenty komunikatów DDE to globalne atomy lub obiekty pamięci udostępnionej. Aplikacje korzystające z tych argumentów muszą przestrzegać jawnych reguł dotyczących tego, kiedy należy je przydzielić i usunąć. We wszystkich przypadkach nadawca komunikatu musi usunąć dowolny obiekt atomu lub pamięci udostępnionej, którego zamierzony odbiornik nie otrzyma z powodu błędu, takiego jak błąd funkcji PostMessage.
Funkcja DDE używa obiektów pamięci współdzielonej do trzech celów:
- W celu przenoszenia wartości elementu danych do wymiany. Jest to element, do którego odwołuje się parametr hData w komunikatach WM_DDE_DATA i WM_DDE_POKE.
- Aby nosić opcje w komunikacie. Jest to element, do którego odwołuje się parametr hOptions w komunikacie WM_DDE_ADVISE.
- Do obsługi ciągu wykonania polecenia. Jest to element, do którego odwołuje się parametr hCommands w komunikacie WM_DDE_EXECUTE oraz odpowiadający mu komunikat WM_DDE_ACK.
Aplikacja, która odbiera obiekt pamięci udostępnionej DDE, musi traktować go jako tylko do odczytu. Aplikacja nie może używać obiektu jako wzajemnego obszaru odczytu i zapisu do bezpłatnej wymiany danych.
Podobnie jak w przypadku atomu DDE, aplikacja powinna zwolnić obiekt pamięci udostępnionej, aby efektywnie zarządzać pamięcią. Aplikacja powinna również blokować i odblokowywać obiekty pamięci.
Dynamiczne komunikaty wymiany danych — omówienie
Ponieważ DDE jest protokołem opartym na komunikatach, nie stosuje żadnych funkcji ani bibliotek. Wszystkie transakcje DDE są przeprowadzane przez przekazywanie określonych zdefiniowanych komunikatów DDE między klientem a oknami serwera.
Istnieją dziewięć komunikatów DDE; stałe symboliczne dla tych komunikatów są zdefiniowane w pliku nagłówka DDE. Niektóre struktury dla różnych komunikatów DDE są również zdefiniowane w tym pliku nagłówka.
Poniższa tabela zawiera podsumowanie komunikatów DDE.
Komunikat | Opis |
---|---|
WM_DDE_ACK | Potwierdza odbieranie lub brak odbierania komunikatu. |
WM_DDE_ADVISE | Żąda od aplikacji serwera podania aktualizacji lub powiadomienia o elemencie danych za każdym razem, gdy się zmieni. Spowoduje to utworzenie trwałego łącza danych. |
WM_DDE_DATA | Wysyła wartość elementu danych do aplikacji klienckiej. |
WM_DDE_EXECUTE | Wysyła ciąg do aplikacji serwera, która ma przetwarzać ciąg jako serię poleceń. |
WM_DDE_INITIATE | Inicjuje konwersację między aplikacjami klienta i serwera. |
WM_DDE_POKE | Wysyła wartość elementu danych do aplikacji serwera. |
WM_DDE_REQUEST | Żąda aplikacji serwera, aby podała wartość elementu danych. |
WM_DDE_TERMINATE | Kończy konwersację. |
WM_DDE_UNADVISE | Przerywa trwałe łącze danych. |
Aplikacja wywołuje SendMessage w celu wydania komunikatu WM_DDE_INITIATE lub komunikatu WM_DDE_ACK wysłanego w odpowiedzi na WM_DDE_INITIATE. Wszystkie inne komunikaty są wysyłane przez PostMessage. Pierwszym parametrem tych wywołań jest uchwyt do okna odbierania; drugi parametr zawiera komunikat do wysłania; trzeci parametr identyfikuje okno wysyłania; i czwarty parametr zawiera argumenty specyficzne dla komunikatów.
Dynamiczny przepływ komunikatów wymiany danych
Typowa konwersacja DDE składa się z następujących zdarzeń:
Aplikacja kliencka inicjuje konwersację, a aplikacja serwera odpowiada.
Aplikacje wymieniają dane przy użyciu dowolnej lub wszystkich następujących metod:
-
- Aplikacja serwera wysyła dane do klienta na żądanie klienta.
- Aplikacja kliencka wysyła niepożądane dane do aplikacji serwera.
- Aplikacja kliencka żąda aplikacji serwera, aby powiadomić klienta za każdym razem, gdy zmieni się element danych (link ciepłych danych).
- Aplikacja kliencka żąda, aby aplikacja serwera wysyłała dane za każdym razem, gdy dane się zmienią (link do gorących danych).
- Aplikacja serwera wykonuje polecenie na żądanie klienta.
-
Klient lub aplikacja serwera kończy konwersację.
Okno aplikacji, które przetwarza żądania od klienta lub serwera, musi przetwarzać je ściśle w kolejności, w której są odbierane.
Klient może ustanowić konwersacje z więcej niż jednym serwerem; serwer może prowadzić konwersacje z więcej niż jednym klientem. W przypadku obsługi komunikatów z więcej niż jednego źródła klient lub serwer musi przetwarzać komunikaty konwersacji synchronicznie, ale nie musi przetwarzać wszystkich komunikatów synchronicznie. Innymi słowy, może ona przejść z jednej rozmowy do innej zgodnie z potrzebami.
Jeśli aplikacja nie może przetworzyć żądania przychodzącego, ponieważ oczekuje na odpowiedź DDE, musi zapobiec zakleszczeniu, wysyłając komunikat WM_DDE_ACK z członkiem fBusy w strukturze DDEACK ustawionym na 1. Aplikacja może również wysłać komunikat zajęty WM_DDE_ACK, jeśli z jakiegokolwiek powodu nie może przetworzyć żądania przychodzącego w rozsądnym czasie.
Aplikacja powinna być w stanie obsłużyć awarię klienta lub serwera, aby reagować na komunikat w określonym czasie. Ponieważ interwał limitu czasu może się różnić w zależności od charakteru aplikacji i konfiguracji systemu użytkownika (w tym tego, czy jest połączony z siecią), aplikacja powinna zapewnić użytkownikowi sposób określenia interwału.
Funkcje pakowania parametrów
Parametr lParam wielu komunikatów DDE zawiera dwa fragmenty danych. Na przykład lParam komunikatu WM_DDE_DATA zawiera uchwyt danych i atom. Aplikacje muszą używać funkcji PackDDElParam w celu spakowania uchwytu i atomu do parametru lParam oraz funkcji UnpackDDElParam, aby usunąć wartości. Aplikacje DDE muszą używać PackDDElParam i UnpackDDElParam dla wszystkich wiadomości przesyłanych podczas konwersacji DDE.
Aplikacje mogą również używać funkcji ReuseDDElParam i FreeDDElParam. ReuseDDElParam umożliwia aplikacji DDE ponowne użycie spakowanego parametru lParam, co pomaga zmniejszyć liczbę lokalizacji pamięci, które aplikacja musi wykonać podczas konwersacji. Aplikacja może użyć FreeDDElParam, aby zwolnić pamięć skojarzoną z uchwytem danych odebranym podczas konwersacji DDE.
Dynamiczna wymiana danych i personifikacja
Aby umożliwić serwerowi podszywanie się pod klienta, klient wywołuje funkcję DdeSetQualityOfService. Struktura SECURITY_IMPERSONATION_LEVEL służy do kontrolowania poziomu podszywania się, którego serwer może używać.
Serwer DDE może personifikować klienta DDE, wywołując funkcję ImpersonateDdeClientWindow. Serwer DDEML powinien używać funkcji DdeImpersonateClient.