ПЕРЕЛІК ДИСЦИПЛІН:
  • Адміністративне право
  • Арбітражний процес
  • Архітектура
  • Астрологія
  • Астрономія
  • Банківська справа
  • Безпека життєдіяльності
  • Біографії
  • Біологія
  • Біологія і хімія
  • Ботаніка та сільське гос-во
  • Бухгалтерський облік і аудит
  • Валютні відносини
  • Ветеринарія
  • Військова кафедра
  • Географія
  • Геодезія
  • Геологія
  • Етика
  • Держава і право
  • Цивільне право і процес
  • Діловодство
  • Гроші та кредит
  • Природничі науки
  • Журналістика
  • Екологія
  • Видавнича справа та поліграфія
  • Інвестиції
  • Іноземна мова
  • Інформатика
  • Інформатика, програмування
  • Юрист по наследству
  • Історичні особистості
  • Історія
  • Історія техніки
  • Кибернетика
  • Комунікації і зв'язок
  • Комп'ютерні науки
  • Косметологія
  • Короткий зміст творів
  • Криміналістика
  • Кримінологія
  • Криптология
  • Кулінарія
  • Культура і мистецтво
  • Культурологія
  • Російська література
  • Література і російська мова
  • Логіка
  • Логістика
  • Маркетинг
  • Математика
  • Медицина, здоров'я
  • Медичні науки
  • Міжнародне публічне право
  • Міжнародне приватне право
  • Міжнародні відносини
  • Менеджмент
  • Металургія
  • Москвоведение
  • Мовознавство
  • Музика
  • Муніципальне право
  • Податки, оподаткування
  •  
    Бесплатные рефераты
     

     

     

     

     

     

         
     
    Протоколи і стандарти об'єктно-орієнтованого програмування
         

     

    Інформатика, програмування

    OLE

    DDE

    Clipboard

    РЕФЕРАТ з дисципліни "Теорія проектування трансляторів" на тему Протоколи і стандарти об'єктно-орієнтованого програмування

    Виконано студентом групи АП-1-91 Маслюкова А.О.

    ЗМІСТ

    Передмова

    MS Windows і новий метод розробки програм

    Динамічний обмін даними

    OLE-технологія

    Висновок

    Список літератури

    Додаток 1.Прімер використання OLE-технології

    Передмова

    Найбільш поширеним мовою програмування останні -го десятиліття безумовно є С. Цьому сприяли такійого особливості, як лаконічність, потужність, гнучкість, мо -нестабільність. Разом з тим, стрімке ускладнення програм, дляреалізації яких застосовуються традиційні процедурно-орієнтир -ванн мови програмування і, зокрема С, змушують гово -вірить про певну кризу в їх використанні, пов'язаному преж -де все з недостатньою надійністю і виразною здатністю.

    Подібних недоліків багато в чому позбавлені мови об'єктно-оріен -тірованнго програмування (ООП), в сонове которихлежіт ідея мо -делірованія об'єктів за допомогою ієрархічно пов'язаних класів.
    Окремо взятий клас розглядається як совакупность безлічіданих та операцій над ними, причому доступ до елементів данихкласу можливий тільки за допомогою операцій цього класу. Уста -Постановою чіткої взаємозалежності між даними та операціями ве -дет до великої цілісності даних і значно підвищує надійністьність програм в порівнянні з традиційними мовами программир -вання. Крім того, ідея програмування за допомогою класів учому використовує той самий підхід, який дозволяє людям формую -вати моделі об'єктів реального світу.

    Вперше ідеї ООП були реалізовані в середині 60-х років вмовою програмування Симула-67. Останній, однак, не знайшов утой час широкого розповсюдження як у силу своєї щодоменшої продуктивності в порівнянні з традиційними мовамитипу FORTRAN, ALGOL, PL/1 так і, можливо, неадекватності предла -Гаєм коштів вирішуються в той час завдання. Ще одним важливим огра -ніченіем для распространеія Симула-67 стали труднощі, з якими,ми довелося зіткнутися більшості програмістів при його вивчить -панії. Справа в тому, що разом з цілою низкою безумовних переваг,ідеї ООП володіють і один суттєвий недолік - вони далеконе прості для розуміння і особливо для освоєння з метою практи -тичного використання.

    С + + - розвиток С.

    С + + - це об'єктно-оріентірованиий мова, тобто мова, поз -воляй програмісту оперувати об'єктами деяких типів,їм попередньо визначеним. Назва мови "С + +" відображаєеволюційний характер зміни мови С (запис "++", в мові С,означає, що до якоїсь змінної додається одиниця). Вінмає ще більш потужні й гнучкі засоби для написання ефектив -них програм, ніж С, від якого він стався. Людина, програм -мірующій на традиційних мовах, може просто втратити голову відтих можливостей, які надає З ++.

    Але не менш важливим є те, що такий поширений іуніверсальна мова, як С, збережений як основи. З простий,ефективний, переносимо. Чого тільки немає в мові С: строкових дан -нихнет, матриць немає, засобів паралельного програмування тежнемає. Немає навіть вводу-виводу.

    Типи, операції і оператори З дуже близькі до того, з чим мимаємо справу в Асемблері, - числа, адреси, арифметичні і логи -етичні дії, цикли ... Крім того, багато особливостей З тиж -вусмисленно натякаю компілятору, як скоротити код і час використан -гання програми. Ці характерні риси мови З дозволяють напи -описати ефективно працює і не надто складний компілятор. І хо -тя в машинних кодах на різних комп'ютерах елементарні операціїобозначаютс по-різному, навряд чи розробнику компілятора прийде вголову інтерпретувати найпростіші вираження яких-небудь ориг -нальним способом. Саме тому мова С "йде скрізь і на всьому",програми, написані на ньому, працюють ефективно, і їх можна пе -реносіть з одного комп'ютера на інший.

    Більшість мов програмування створені для вирішення оп -ределенного кола завдань. У них не тільки не вистачає певнихтипів даних і функцій, а й багато зайвого з точки зору челове -ка, далекого від області, на яку орієнтований мова. Спеціалі -зірованние типи даних або оператори, що вимагають нетривіальноюпідтримки, ускладнюють вивчення мови і заважають вашій роботі, якщови ними не збираєтеся користуватися. Тому С, у якому немає ні -чого зайвого, популярний серед широкого кола програмістів. Соот -відповідне бібліотеки можуть додати до засобів мови спеціалі -зірованние функції для роботи з рядками, файлами, списками, ус -тройствамі введення-виведення, математичними об'єктами і т.д. Залишається -ся тільки вибрати те, що потрібно особисто вам. Заголовки про -легшає використання бібліотек, надають корисні типи дан -них, глобальні змінні, макровизначеннями ... Вони багато в чому ус -траняют протиріччя між ефективністю програми і зручністювикористання бібліотечних функцій. Вони також дозволяють не повторювалирятся і не писати по кілька разів одне й теж в різних прог -Рамі. Оскільки С був створений спеціально для системного програм -мування, він має можливості низького рівня, що дозволяють "иг -рать без правил ". Залежно від пристрою і операційної сис -теми вашої машини ви можете "влізти" в відеопам'ять або вико -вать системні програми, що знаходяться в оперативній пам'яті.

    У будь-якому випадку ви можете розглядати код власної прог -Рамі як дані, а масив даних як код функції, квадратнуматрицю як вектор, а текст як бінарне дерево. Що б не зна -доводилося в пам'яті - це всього лише послідовна ланцюжок чисел.
    Якщо ви не боїтеся ризику - можете робити все, що вам заманеться.

    Сучасні прграммісти вибирають С не тільки через його най -важливіших конкурентних переваг. В даний час ми маємо справу з ланцюговою реакцією: чимбільше написано на С, тим більше на ньому напишуть ще. Це одна зпричин, чому мова С + + зберігає З як підмножини.

    На думку автора С + +, Бьерн Страуструп, різниця міжідеологією С і С + + полягає приблизно в наступному: програм на
    З відображає "спосіб мислення" процесора, а С + + - спосіб мисленняпрограміста. Відповідаючи вимогам сучасного програмування,
    С + + робить акцент на розробці нових типів даних, найбільш пів -але відповідних концепцій обраної галузі знань і завданнямдодатки. На З пишуть бібліотеки функцій, С + + дозволяє ство -вать бібліотеки класів. Клас є ключовим поняттям С + +.
    Опис класу містить опис даних, потрібних для перед -уявлення об'єктів цього типу, і набір операцій для роботи з по -добнимі об'єктами.

    На відміну від традиційних структур С або Паскаля, членамикласу є не тільки дані, але й функції. Функції-членикласу мають привілейований доступ до даних усередині об'єктівцього класу і забезпечують інтерфейс між цими об'єктами і ос -ментальною програмою. При подальшій роботі зовсім не орга -тельно пам'ятати про внутрішню структуру класу і мехагізме роботи
    "вбудованих функцій". У цьому сенсі клас подібний електричномуприладу - мало хто знає про його устрій, але всі знають, як їмкористуватися.

    Часто з метою підвищення ефективності та спрощення структурипрограми доводиться змушувати її працювати з різнорідними об'єктивнимтами так, як якби вони мали один і той самий тип. Наприклад, ок -ружность і квадрат природно розглядати як варіанти геомет -річеской фігури. Корисно складати списки фігур, намальованих наекрані, або функцій, які їх розмножують, рухають і т.д. Про точ -ном тип об'єкта доводиться деколи забувати. Список геометрічес -ких фігур "не знає", що в ньому знаходиться - відрізки або звездоч -ки. Не знає цього і компілятор. Але весь час, поки ви малюєтеці об'єкти, неминуче доводиться "пам'ятати", що вони з себепредставляють. Звичайно, можливості низького рівня дозволяють "за -бувати "і" згадувати "коли і як нам заманеться, але прице компілятор втрачає контроль над свідомістю дій.

    Використання похідних класів і віртуальних функцій поз -воля уникнути ризикованої техніки і не дбає про те, в ка -кой формі об'єкт типу "геометрична фігура" зберігає інформацію проте, коло він або квадрат. (Крім можливостей ООП, створення ти -пов даних "трикутник" або "квадрат" як похідні від базово -го класу "геометрична фігура" відображає логічний зв'язок поня -тий). Віртуальні функції, по суті, визначають, що самеможна робити з об'єктом, а не те, як це робити. Створюючи клас
    "геометрична фігура", ми можемо включити в нього віртуальніфункції малювання, збільшення, повороту. З використанням цихфункцій можна створити ще один член класу.

    Потім можна розробити бібліотеку програм інтерактивноїграфіки, забезпечивши її засобами діалогове, функціями на кшталт доповнено -ня деякої області екрану однаковими геометричними фігура -ми і т.д. Бібліотечні функції будуть викликати функції-члени клас -са "геометрична фігура": малювання, руху, повороту, увели -чення. А після того, як ми все це напишемо, откомпіліруем, спря -чим текст функцій, які вважаємо своєї інтелектуальної влас -громадськістю, починається найцікавіше. Тепер ми можемо опи -описати скільки завгодно нових типів фігур - багатокутників, зірка -чек, еліпсів - похідних від класу "геометрична фігура" іпояснити, як їх малювати, збільшувати і повертати. Як дви -гать - пояснювати не треба. Це вже є в базовому класі. Опціїнашої бібліотеки можуть працювати соб'ектамі новостворених типів,для них це варіанти геометрічесой фігури. Слід зазначити, щов похідних класах можуть (і, як правило, винні) являтисядані та функції, яких немає в базовому класі. Однак, жодна зфункцій, що обробляють "геометричні фігури", ніколи не уз -нает про специфічні властивості багатокутника або еліпса, крімтого, що вони по-своєму малюються, збільшуються і повертаються.
    Похідний клас сам може бути базовим для інших класів, апізні версії С + + дозволяють зробити один клас похідним відкількох інших.

    При написанні програми часто допускаються прикрі оплошнос -ти, що виявляються лише на стадії виконання і, на жаль, занадтопізно. Наприклад, якщо змінна за змістом - знаменник дробу,хотілося б отримати повідомлення про ошіюке тоді, коли їй присвоюються -ється нуль, а не тоді, коли на цей нуль що-небудь ділиться.
    Або, скажімо, функція малювання точки. Неможливо утриматися відспокуси викликати її хоча б раз без перевірки виходу за межіекрану. У той же час, якщо ми пишемо програму малювання лінії,обов'язково потрібна функція, яка тупо ставить крапку - і як мож -але швидше. Існує багато ситуацій, коли функції і даніслід дозволити використовувати тільки привілейованих функцій,над якими ва "добре подумали". У С + + цього можна домогтися,зробивши "небезпечні" дані і функції захищеними членами якого-ні -будь класу. До них мають доступ тільки функції-члени цього жкласу, а так само друзі класу. Навпаки, якщо дані або фун -кціі-члени оголошені public, вони є загальнодоступними.

    С + + надає в розпорядження програміста складні типиданих. Проте ні апарат класів, ні перевантаження операцій невпливають на ефективність. Те, що клас - це клас, відомотільки компілятору. Якщо функції-члени класів оголошені inline,на їх виклик не потрібен час. Фактично це не функції, а під -становки. Лише віртуальні функції залишають щодо не -великий слід в оперативної пам'яті.

    Зі всього вище сказаного випливає логічний висновок: С + + наиб -леї зручний, універсальний і необхідний мову. Але все ж таки метушні -кає питання, що ж було написано на цій мові, використовуючи прин -ципи ООП, що можна було б "помацати" будь-якому програмісту абокористувачеві. Відповідь очевидна - це Microsoft Windows.

    MS Windows і новий метод розробки програм.

    Одним з найбільш важливих механізмів взаємодії програмє обмін даними. У MS Windows існує кілька способіввзаємодії додатків:

    - поштову скриньку;

    - динамічний обмін даними;

    - вбудовування об'єктів.

    Спеціальний поштовий ящик (clipboard) Windows дозволяєкористувачеві переносити інформацію з однієї програми до іншої,не піклуючись про її форматах та поданні.

    На відміну від професійних операціональних операційнихсистем, де механізм обміну даними між програмами доступнийтільки програмісту, у Windows це робиться дуже просто і наг -лядно для користувача.

    Механізм обміну даних між додатками - життєво важливевластивість багатозадачного середовища. І в даний час виробникипрограмного забезпечення вже прийшли до висновку, що для перенесенняданих з однієї програми до іншої поштової скриньки вже недостатньоточно. З'явився новий, більш універсальний механізм - OLE (
    Object Linking and Embedding)

    - Вбудована об'єктна зв'язок, який дозволяє пе -реносіть з однієї програми до іншої різнорідні дані. Напри -заходів, за допомогою цього механізму дані, підготовлені в системімережевого планування Time Line for Windows (Symantec), можнапереносити в текстовий процесор Just Write (Symantec), а за -тим, скажімо, в генератор додатків Object Vision (Borland).
    Правда, це вже нестандартне засіб Microsoft Windows, але тимне менше реалізація OLE стала можливою саме в Windows.

    Крім механізму поштової скриньки, призначеного, в основ -ном, для користувача, програмісту в Windows доступні спе -соціальне засобу обміну даними між додатками.

    Програмним шляхом можна встановити прямий зв'язок між заду -чамі, наприклад, беручи дані з послідовного порту, авто -автоматично поміщати їх, скажімо, в комірки електронної таблиці
    Excel, засобами якої можна відразу відображати складні залежністьмости у вигляді графіків або здійснювати їх обробку в реальномурежимі часу (цей механізм має назву динамічного обме -на даними - Dynamic Data Exchange, DDE).

    Основні терміни

    Клієнтський додаток DDE - додаток, з яким необхідно -мо встановити діалог з сервером та отримати дані від сервера впроцесі діалогу.

    DDE-діалог - взаємозв'язок між клієнтських і серверних при -ложении.

    Сервер-додаток - DDE програма, яка передає дан -ные клієнтові в процесі діалогу.

    DDE-Транзакція-обмін повідомленнями або даними між кліен -тому і сервером.

    Item ім'я - рядок, що ідентифікує деякий безлічданих, що сервер в стані передати клієнтові в процесідіалогу.

    Service ім'я - рядок, що генерується сервером і використовуючи -Травень клієнтом для встановлення діалогу.

    Рядковий покажчик - подвійне слово, що генерується опера -ционной системою, ідентифікує рядок, що передається в процес -се динамічного обміну даними.

    Topic ім'я - рядок, який ідентифікує тип даних,необхідних клієнтського додатку при динамічному обміні даних.

    Фільтр транзакції - прапор, який перешкоджає передачінебажаних типів транзакцій у функцію зворотного виклику.

    У Microsoft Windows динамічний обмін даних є фор -мій зв'язку, яка використовує спільні області пам'яті для обмінуданими між додатками. Програма може використовувати DDE вдеякий момент часу для передачі та отримання нових даних відсервера.

    Механізм DDE схожий з механізмом поштової скриньки, який є при -ляется частиною операційної системи WINDOWS. Існує лише нез -начітельная різниця в тому, що поштова скринька, в більшості випадківчаї, використовується як буфер тимчасового зберігання інформації. DDEможе бути ініціалізований користувачем і в більшості випадківпродовжувати працювати без його втручання.

    Бібліотека DDEML забезпечує користувача набором засобів,які спрощують використання механізму DDE в WINDOWS Програмипах. Замість того, щоб обробляти, одержувати і передавати DDEповідомлення прямо, додатки використовують функції DDEML бібліотеку -ки. Бібліотека DDEML також забезпечує роботу з рядками і раз -виділяється даними, генерованими DDE додатками. Замість того,щоб використовувати покажчики на загальні області пам'яті, DDE прог -вання створюють і обмінюються рядковими покажчиками, якіідентифікують рядки і дані.

    Вже існуючі програми, що використовують протокол DDE, ос -Нова на повідомленнях повністю сумісні з тими, які ви -користується бібліотекою DDEML. Ось чому додаток, що використовує
    DDE-протокол можуть встановити діалог і виконувати транзакції здодатками, що використовують бібліотеку DDEML.

    Взаємозв'язок між клієнтом і сервером.

    DDE виникає завжди між клієнтським пріложеніем і сервер -вим. Клієнтський додаток ініціалізує обмін даними шляхом ус -тановленія діалогу з сервером і передачі транзакції. Транзакціянеобхідна для даних і обслуговування. Сервер відповідає на транзак -цію і забезпечує клієнта даними. Сервер може мати відразу ніс -колько клієнтів в один і той же час, у свою чергу, клієнт мо -жет отримувати дані відразу від декількох серверів. Деякий при -ложении одночасно може бути і клієнтом і сервером. В добавокдо вищесказаного, клієнт і сервер можуть обірвати діалог в будь-якийзручний для них час.

    DDE сервер використовує три зарезервованих типу імен, рас -покладених ієрархічно: service, topic item - унікально ідентифі -ціруют деякий безліч даних, що сервер може передатиклієнтові в процесі діалогу.

    Service ім'я - це рядок, який генерує сервер в тіпроміжки часу, які клієнт може встановити діалог зсервером.

    Topic ім'я - це рядок, який ідентифікує логічес -кий контекст даних. Для сервера, який маніпулює файлами,topic імена це просто назви файлів; для інших серверів - цеспецифічні імена конкретного додатка. Клієнт обов'язковоповинен вказувати topic ім'я разом з ім'ям service, коли він хо -чет встановити діалог з сервером.

    Item ім'я - це рядок, який ідентифікує некот -рої безліч даних, що сервер може передати клієнту впроцесі транзакції. Наприклад, item ім'я може ідентифікувати
    ЦЕЛОЕ (int, integer), СТРОКУ (string, char *), кілька па -раграфов тексту, або BITMAP образ.

    Всі вищезгадані імена дозволяють клієнту встановити діа -лог з сервером та отримати від нього дані.

    Системний режим

    Системний режим роботи забезпечує клієнта всієї необхід -мій Інформція про сервер.

    Для того, щоб визначити, які сервери доступні в дан -ний момент часу, а також якою інформацією вони можуть забез -чити клієнта, останній, перебуваючи в початковому режимі роботи, дол -дружин встановити ім'я пристрою, що дорівнює NULL. Такий шаблон діалогумаксимально збільшує ефективність роботи, а також роботу зсервером в системному режимі. Сервер, у свою чергу, повинен під -держівать нижчеописані item імена, а також інші, часто ви -пользуемие клієнтом:

    SZDDESYS ITEM TOPICS - список item імен, з якими можепрацювати сервер в даний момент часу. Цей список може вимірюв -няться час від часу.

    SZDDESYS ITEM SYSITEMS - список item імен, з якими мо -жет працювати сервер в системному режимі.

    SZDDDESYS ITEM STATUS - запросити поточний статус сервера.
    Звичайно, цей запит підтримується тільки у форматі CF_TEXT імістить рядок типу Готовий/Зайнятий.

    SZDDE ITEM ITEMLIST - список item імен, які підтримуються сер -вером у несистемності режимі роботи. Цей список може змінюватисячас від часу.

    SZDDESYS ITEM FORMATS - список рядків, що представляє собоюсписок всіх форматів поштової скриньки, які підтримуються серверомданому діалозі. Наприклад, CF_TEXT формат представлений рядком TEXT.

    Основне призначення і робота функції зворотного виклику

    Додаток, який використовує DDEML, повинно містити фун -кцію зворотного виклику, яка обробляє події, отриманідодатком. DDEML повідомляє додаток про такі події шляхомпосилки транзакцій у функцію зворотного виклику даного продукту.

    Залежно від прапора фільтра транзакції, сформованогопри виконанні функції DdeInitialize, функція зворотного виклику напів -чає відсортовані транзакції незалежно від того, є по -ся чи для цієї програми клієнтом, сервером або тим і іншим од -новременно. Наступний приклад демонструє найбільш типове ис -користування функції зворотного виклику.

    HDDEDATA CALLBACK DdeCallback (uType, uFmt, hconv, hsz1,hsz2, hdata, dwData1, dwData2)

    UINT uType;// Тип транзакції

    UINT uFmt;// Формат поштою скриньки

    HCONV hconv;// Ідентифікатор діалогу

    HSZ hsz1;// Ідентифікатор рядка # 1

    HSZ hsz2;// Ідентифікатор рядка # 2

    HDDEDATA hdata;// Ідентифікатор глобального об'єктивним та пам'яті

    DWORD dwData1;// Дані поточної транзакції # 1

    DWORD dwData2;// Дані поточної транзакції # 2

    (switch (uType)

    (case XTYP_REGISTER: case XTYP_UNREGISTER:

    . . . return (HDDEDATA) NULL;

    case XTYP_ADVDATA:

    . . . return (HDDEDATA) DDE_FACK;

    case XTYP_XACT_COMPLETE:

    . . . return (HDDEDATA) NULL;

    case XTYP_DISCONNECT:

    . . . return (HDDEDATA) NULL;

    default: return (HDDEDATA) NULL;

    )

    )

    Параметр uType ідентифікує тип надісланій транзакції вфункцію зворотного виклику за допомогою DDEML. Значення, що залишилисяпараметрів залежать від типів транзакції. Типи транзакцій будуть про -судилися нами в розділі "Обробка транзакцій".

    Діалог між додатками

    Діалог між клієнтом і сервером завжди встановлюється завимогу клієнта. Коли діалог встановлено, обидва партнери напів -ють ідентифікатор, який описує даний діалог.

    Партнери використовують цей ідентифікатор у більшості фун -кцій DDEML робити транзакцій і для їх обробки. Клієнту мо -жет знадобитися діалог як з одним сервером, так і з нескольки -ми.

    Розглянемо докладно як додаток встановлює діалог іотримує інформацію про вже існуючих каналах зв'язку.

    Простий Діалог

    Клієнтський додаток встановлює простий діалог з серве -ром шляхом виклику функції DdeConnect і визначає ідентифікаторирядків, які містять всю необхідну інформацію про service име -ні поточного сервера і інтересущем клієнта в даний момент topicімені.

    DDEML відповідає на виклик цієї функції посилкою відповідаю -щей транзакції XTYP_CONNECT у функцію зворотного виклику кожногодоступного в даний момент часу сервера, зареєстрованеім'я якого збігається з ім'ям, переданим за допомогою функції
    DdeConnect за умови, що сервер не відключав фільтр serviceімені викликом функції DdeServiceName.

    Сервер може також встановити фільтр на XTYP_CONNECT тран -закцію завданням відповідного прапора CBF_FAIL_CONNECTIONS привиконанні функції DdeInitialize.

    У процесі обробки транзакції типу XTYP_CONNECT DDEML пе -реда отримані від клієнта service і topic імена сервера. Сер -вер повинен перевірити ці імена і повернути TRUE, якщо він в сос -тояніі працювати з такими іменами, і FALSE в іншому випадку.
    Якщо ні одна з існуючих серверів не відповідає на CONNECT-зап -рос клієнта, функція DDeConnect повертає йому NULL з інформа -єю про те, що в даний момент часу НЕ можливо встановитидіалог.

    Проте, якщо сервер повернув TRUE, то діалог був успішновстановлений і клієнт отримує ідентифікатор діалогу

    - подвійне слово, за допомогою якого і ведетьсяобмін даними з сервером.

    Потім сервер отримує транзакцію виду XTYP_CONNECT_CONFIRM
    (у випадку, якщо він НЕ описував прапор фільтра CBF_FAIL_CONFIRMS привиклику відповідної функції).

    У нижче наведеному прикладі відбувається спроба встановитидіалог з сервером, який в змозі працювати з service ім'ям
    'My Server' в системному режимі. Вважаємо, що параметриhszSysTopic і hszServName вже попередньо створені нами раніше.

    HCONV hConv;

    HWND hwndParent;

    HSZ hszServName;

    HSZ hszSysTopic;

    . . .

    hConv = DdeConnect (idInst,// Копія програми hszServName,// Ідентифікатор service-імені handle hszSysTopic,// Ідентифікатор system-topic-імені

    (PCONVCONTEXT) NULL);// Використовуємо контекст за замовчуванням

    if (hConv == NULL)

    (

    MessageBox (hwndParent, "MyServer НЕ доступний !",

    (LPSTR) NULL, MB_OK); return FALSE;

    )

    . . .

    У цьому прикладі функція DdeConnect змушує DDEML поси -лать транзакцію виду XTYP_CONNECT у функцію зворотного виклику сер -віра MyServer.

    А тепер наведемо приклад функції зворотного виклику сервера,який обробляє транзакцію XTYP_CONNECT і порівнює своєзареєстроване ім'я з ім'ям, отриманим від клієнта. Як вжебуло відмічено раніше, якщо вони співпадають, то сервер в станівстановити діалог з клієнтом.

    # define CTOPICS 5

    HSZ hsz1;// Ідентифікатор рядка, отриманий від DDEML.

    HSZ ahszTopics [CTOPICS];// Масив поддрежіваемих topic імен int i;// Лічильник циклу

    .

    .// Для обробки транзакцій використовуємо стандартну

    ANSI C

    .// Конструкцію switch -> case -> default.

    .

    case XTYP_CONNECT: for (i = 0; i

    (if (hsz1 == ahszTopics [i]) return TRUE;// Встановлення діалогу

    )

    return FALSE;// Topic ім'я НЕ підтримується, діалог заборонено.

    .

    .// Обробка інших типів транзакцій.

    .

    Якщо сервер повертає TRUE у відповідь на транзакцію
    XTYP_CONNECT, DDEML посилає транзакцію виду XTYP_CONNECT_CONFIRMу функцію зворотного виклику цього сервера. Опрацювавши цю тран -закцію, сервер може отримати ідендіфікатор діалогу.

    Замість конкретного імені сервера клієнт може встановитишаблон діалогу шляхом встановлення ідентифікаторів service і topicімен у NULL при виконанні функції DdeConnect.

    Якщо хоча б один з перерахованих вище ідентифікаторів ра -вен NULL, DDEML посилає транзакцію типу XTYP_WILDCONNECT у фун -кцію зворотного виклику всіх активних в даний момент DDE-Програминий (виключення становлять лише ті, хто при виклику відповідаю -щей функції вказав прапор фільтрації XTYP_WILDCONNECT).

    Будь-сервер-додаток повинен відповісти на дану транзак -цію і повернути вказівник на масив структур типу HSZPAIR, Окан -Чіван нулем.

    Якщо сервер-додаток НЕ викликає функцію DDeNameServiceдля реєстрації власного service імені в системі і фільтр про -ництва транзакцій включений, то сервер НЕ отримає транзакцію виду
    XTYP_WILDCONNECT.

    Вищеописаний масив повинен містити одну структуру длякожного service і topic імен. DDEML вибирає одну пару з масси -ва для встановлення діалогу і повертає його ідентифікатор кліен -ту. Потім DDEML посилає серверу транзакцію виду
    XTYP_CONNECT_CONFIRM (виключення становлять лише ті сервери, ко -торие при ініціалізації встановили фільтр обробки транзакцій).

    Продемонстіруем використання транзакції виду XTYP_CONNECT.

    # define CTOPICS 2

    UINT uType;

    HSZPAIR ahszp [(CTOPICS + 1 )];

    HSZ ahszTopicList [CTOPICS];

    HSZ hszServ, hszTopic;

    WORD i, j;

    if (uType == XTYP_WILDCONNECT)

    (

    // Скануємо список topic імен і створюємо мас-Сів структур типу HSZPAIR

    j = 0 ; for (i = 0; i

    (if (hszTopic == (HSZ) NULL | | hszTopic == ahszTopicList [i])

    (ahszp [ j]. hszSvc = hszServ; ahszp [j + +]. hszTopic = ahszTopicList [i];

    )

    )

    //

    // Останній елемент масиву завжди NULL.

    //

    ahszp [j]. hszSvc = NULL; ahszp [j + +]. hszTopic = NULL;

    //

    // Повертаємо дискриптор глобального об'єкта

    // пам'яті, що містить структури типу HSZPAIR.

    //

    return DdeCreateDataHandle ( idInst,// Копія програми

    (LPBYTE) & ahszp,// Покажчик на масив типу HSZPAIR

    sizeof (HSZ) * j,// Довжина масиву

    0,// Початкове зміщення

    (HSZ) NULL,// item-ім'я не існує

    0,// формат item-імені також

    // не існує

    0);// покладали всі роботу

    // з масивом на систему

    )

    Будь-сервер або клієнт може обірвати діалог в будь-який вре -ма шляхом виклику функції DdeDisconnect. Це означає, що партнерз обміну даними отримує транзакцію типу XTYP_DISCONNECT у фун -кціі зворотного дзвінка (якщо, звичайно, партнер не встановив фільтробробки транзакцій виду CBF_SKIP_DISCONNECTIONS).

    Зазвичай програма реагує на транзакцію XTYP_DISCONNECTвикликом функції DdeQueryInfo для отримання інформації про сам процесщенном діалозі. Після того, як функція зворотного виклику обро -тала транзакцію типу XTYP_DISCONNECT, ідентифікатор діалогубільше не існує.

    Клієнтський додаток, яке отримує транзакцію типу
    XTYP_DISCONNECT у своїй функції зворотного виклику може попи -таться відновити діалог при промощі виклику функції
    DdeReconnect. Клієнтський додаток може викликати цю функціютільки перебуваючи усередині своєї власної функції зворотного виклику.

    Складний діалог

    Клієнтський додаток може використовувати функцію
    DdeConnectList для того, щоб визначити, які сервер-Програминя існують в системі в даний момент часу.

    Клієнт обов'язково повинен описувати service і topic імена,коли він викликає цю функцію; це означає, що DDEML повиннапослати транзакцію виду XTYP_CONNECT всі функції зворотного визо -ва всіх наявних у даний момент сервер-додатків, чиї зарегіс -трірованние імена збігаються з іменами, зазначеними клієнтом (іс -ключенних становлять лише ті сервери, які фільтрують отримує -мі транзакції).

    На додаток до вищесказаного, можна зазначити, що клієнт,при виконанні функції DdeConnectList, може вказати NULL якservice або topic імені, або ж відразу для обох. Всі доступні всистемі сервери, зареєстровані чиї імена збігаються з імена -ми, зазначеними клієнтом, відповідають на його запит. Діалог устанав -ється з усіма такими серверами, навіть якщо в системі запущеноодне і теж сервер-додаток кілька разів.

    Клієнт може використовувати функції DdeQueryNextServer і
    DdeQueryConvInfo для того, щоб зрозуміти, який сервер знаходиться всписку, отриманий при виконанні функції DdeConnectList.
    DdeQueryNextServer повертає ідентифікатор діалогу для Наст -го сервера, що знаходиться в списку; DdeQueryConvInfo заповнюєструктуру CONVINFO інформацією про діалог.

    Клієнт може зберегти отримані ідентифікатори діалогів івідмовитися від перегляду залишилися серверів у списку.

    Наведемо приклад використання функції DdeConnectList длявстановлення діалогу з усіма серверами, які підтримують ім'я
    'system topic', потім будемо використовувати функції DdeQueryConvInfoі DdeQueryNextServer для отримання їх ідентифікаторів serviceімен, одночасно не забуваючи зберегти останні в тимчасовомубуфері.

    HCONVLIST hconvList;// Список діалогів

    DWORD idInst;// дискриптор програми

    HSZ hszSystem;// System topic

    HCONV hconv = NULL;// Ідентифікатор діалогу

    CONVINFO ci;// Інформація про діалог

    UINT cConv = 0;// Кількість ідентифікаторів діалогів

    HSZ * pHsz, * aHsz;// Покажчик на ідентифікатор рядка

    // Приєднуємось до всіх серверів, що підтримує

    // System topic. hconvList = DdeConnectList (idInst, NULL, hszSystem,

    NULL, NULL);

    // Обчислюємо кількість серверів у списку.

    while ((hconv = DdeQueryNextServer (hconvList, hconv))

    ! = NULL) cConv ++;

    // Виділяємо буфер для збереження ідентифікаторів рядків.

    hconv = NULL; aHsz = (HSZ *) LocalAlloc (LMEM_FIXED, cConv * sizeof (HSZ ));

    // Копіюємо ідентифікатор рядка в буфер.

    pHsz = aHsz; ile ((hconv = DdeQueryNextServer (hconvList, hconv ))! = NULL)

    (

    DdeQueryConvInfo (hconv, QID_SYNC, (PCONVINFO) & ci);

    DdeKeepStringHandle (idInst, ci.hszSvcPartner);

    * pHsz + + = ci.hszSvcPartner;

    )

    .

    .// Використовуємо ідентифікатор: 'спілкуємося' з сервером.

    .

    // Звільняємо пам'ять і припиняємо діалог.

    LocalFree ((HANDLE) aHsz);

    DdeDisconnectList (hconvList);

    Програма може обірвати індивідуальний діалог, що знаходить -ся у списку діалогів шляхом виклику функції DdeDisconnect; Програминя може обірвати всі діалоги, що знаходяться в списку шляхом визо -ва функції DdeDisconnectList.

    Обидві вищевказані функції вказують DDEML про необхідністьпосилки транзакції виду XTYP_DISCONNECT в усі функції партнерівпо діалогу даного застосування (у разі використання функції
    DdeDisconnectList надсилатиметься транзакція XTYP_DISCONNECT длякожного елемента в списку діалогів).

    Обмін даними між додатками

    Так як DDE використовує області пам'яті для передачі данихз однієї програми до іншої, DDEML забезпечує кінцевого прог -рамміста функціями, за допомогою яких DDE-додатки можуть ство -давати і обробляти DDE-об'єкти.

    Весь спектр транзакцій, який викликає обмін даними,вимагає від програми, експортує їх, створення деякогобуфера, що містить ці дані, а потім виклику функції
    DdeCreateDataHandle.

    Ця функція створює DDE-об'єкт, копіює дані з буфера вцей об'єкт і повертає ідентифікатор даних для даного прог -вання.

    Ідентифікатор даних-це подвійне слово, яке використовує
    DDEML для забезпечення доступу до даних у DDE-об'єкті.

    Для того, щоб розділяти дані в DDE-об'єкті, додатокпередає ідентифікатор даних DDEML, а потім DDEML передає його вфункцію зворотного виклику програми, що одержує дані.

    У нижче наведеному прикладі показано, як створити DDE-об'єкті отримати його ідентифікатор. У процесі обробки транзакції ти -па XTYP_ADVREQ, функція зворотного виклику конвертує поточнечас у ASCII рядок, копіює рядок у допоміжний буфер, апотім створює DDE-об'єкт, що містить вищевказану рядок. Фун -кция зворотного дзвінка повертає ідентифікатор DDE-об'єкта DDEML,яка передає цей ідентифікатор клієнтського додатку.

    typedef struct tagTIME

    (

    INT hour;// 0 - 11 формат часу для годинника. < p> INT hour12;// 12-ої формат.

    INT hour24;// 24-ій формат.

    INT minute;

    INT second;

    INT ampm;// 0 -> AM, 1 -> PM

    ) TIME;

    HDDEDATA EXPENTRY DdeCallback

    ( uType, uFmt, hconv, hsz1, hsz2, hdata, dwData1, dwData2)

    UINT uType;

    UINT uFmt;

    HCONV hconv;

    HSZ hsz1;

    HSZ hsz2;

    HDDEDATA hdata;

    DWORD dwData1;

    DWORD dwData2;

    (

    CHAR szBuf [32];

    switch (uType)

    (case XTYP_ADVREQ:

    case XTYP_REQUEST: if ((hsz1 == hszTime & & hsz2 == hszNow)

    & & (uFmt == CF_TEXT))

    (

    // Копіюємо рядок у буфер.

    itoa (tmTime.hour, szBuf, 10); lstrcat (szBuf, ":"); if (tmTime.minute <10) lstrcat (szBuf, "0"); itoa (tmTime.minute,

    & szBuf [lstrlen (szBuf)], 10); lstrcat (szBuf, ":"); if (tmTime.second <10) strcat (szBuf, "0"); itoa (tmTime.second,

    & szBuf [lstrlen (szBuf)], 10); szBuf [lstrlen (szBuf)] = '? я його знищення. Клієнт може скопіювати по -лучанин дані у заздалегідь приготований буфер допомогою визо -ва функції DdeGetData.

    У наступному прикладі ми отримаємо покажчик на DDE-об'єкт,збережемо його в параметрі hData, скопіюємо вміст у часів -ний буфер і знищимо покажчик:

    HDDEDATA hdata;

    LPBYTE lpszAdviseData;

    DWORD cbDataLen;

    DWORD i; char szData [32 ];

    . . .

    case XTYP_ADVDATA: lpszAdviseData = DdeAccessData (hdata,

    & cbDataLen); for (i = 0; i

    DdeUnaccessData (hdata); return (HDDEDATA) TRUE;

    . . .

    Зазвичай, коли програма, що створює ідентифікатор даних,передає його DDEML, цей ідентифікатор псується всередині вишеука -занного програми. У цьому немає нічого страшного, якщо сервер дол -дружин розділяти дані тільки з одним клієнтом. Якщо ж сервер дол -дружин розділяти дані відразу з декількома клієнтами одночасно,йому доведеться вказувати прапор HDATA_APPOWNED при виконанні функції
    DdeCreateDataHandle.

    Це робить можливим отримання прав власності на
    DDE-об'єкт сервер-програми та запобігає псування ідентіфікато -ра даних DDEML. Програма може передавати DDEML ідентифікаторданих будь-яку кількість разів, але викликати функцію
    DdeCreateDataHandle можна лише одного разу.

    Якщо програма вказує прапор HDATA_APPOWNED в параметріatCmd при виконанні функції DdeCreateDataHandle, воно обов'язковоповинно викликати функцію DdeFreeDataHandle для очищення пам'яті позазалежно від того, передавався чи ідентифікатор даних DDEMLчи ні. Перед тим як обірвати діалог, застосування повинне викликаютьвати функцію DdeFreeDataHandle для очищення всіх створених Ідент -фікаторов, але які так і не були передані DDEML.

    Якщо програма ще не передало ідентифікатор DDE-об'єкта
    DDEML, то воно може додати дані до вже існуючого об'єктаабо повністю замінити їх у ньому. Всі ці сервісні функції обслу -проживати функцією DdeAddData.

    Зазвичай додаток використовує цю функцію для нової ініціати -лізації старі не знищених DDE-об'єктів. Після того, як при -ложении передає ідентифікатор даних DDEML, DDE-об'єкт, Ідент -фіцірующій цей ідентифікатор НЕ може бути змінений, однак вінможе бути знищений.

    OLE-технологія

    Як видно з описаного вище протоколу DDE, додаткиповинні обов'язково знати типи даних, що передаються, вміти їх обра -бативать, а в основному навіть можуть працювати тільки з символьнимирядками. Це, звичайно, не дуже зручно, коли необхідно, напри -заходів, створити невеликий текст з різними малюнками, піктограм -мами та іншими наочними або не дуже ілюстраціями. У цьому разі по -чаї на допомогу програмісту проиходит OLE - вбудовування об'єктів.
    Разом з даними ми отримуємо машинний код, який ці дані мо -жет обробляти.

    Способи упорядкування, джерела і цільові документи

    При використанні OLE-технології користувач завжди маєсправу з одним провідним додатком (головним) і одним веденим (під -чинення), а точніше, соднім веденим.

    Програма, за допомогою якого отримано об'єкт для вбудовуючись -ня завжди грає роль підлеглого. Це особливо характерно длявипадків передачі об'єктів при встановленні і зв'язування через бу -фер проміжного обміну.

    Часто використовувані

         
     
         
    Реферат Банк
     
    Рефераты
     
    Бесплатные рефераты
     

     

     

     

     

     

     

     
     
     
      Все права защищены. Reff.net.ua - українські реферати ! DMCA.com Protection Status