Допомога у написанні освітніх робіт...
Допоможемо швидко та з гарантією якості!

Протоколы і стандарти ООП

РефератДопомога в написанніДізнатися вартістьмоєї роботи

Під час написання програми часто допускаються прикрі недогляди, обнаруживающиеся. Поштову скриньку, переважно разі, використовують як буфер тимчасового зберігання. Часто з метою підвищення ефективності і спрощення структури програми доводиться. Функції зворотного виклику може спробувати відновити діалог з допомогою виклику. Варіанти геометричній постаті. Корисно складати списки постатей… Читати ще >

Протоколы і стандарти ООП (реферат, курсова, диплом, контрольна)

Протоколы і стандарти объектно-ориентированного программирования.

Предисловие.

Найпоширенішим мовою програмування протягом останнього десятиліття.

безумовно, є З. Цьому сприяли такі її особливості, як.

лаконічність, потужність, гнучкість, мобільність. Разом про те, стрімке.

ускладнення додатків, для реалізації яких застосовуються традиційні.

процедурно-ориентированнные мови програмування і зокрема З, змушують.

говорити про певну кризу у використанні, пов’язаному насамперед із.

недостатньою надійністю і виразної способностью.

Подібних недоліків багато в чому позбавлені мови объектно-ориентированнго.

програмування (ОВП), основу яких лежить ідея моделювання об'єктів.

у вигляді ієрархічно пов’язаних класів. Окремо узятий клас.

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

доступом до елементам даних класу можлива лише у вигляді операцій цього.

класу. Встановлення чіткої взаємозалежності між даними і операціями веде до.

великий цілісності даних, і значно підвищує надійність програм по.

порівнянню з традиційними мовами програмування. З іншого боку, ідея.

програмування з допомогою класів багато в чому використовує хоча б підхід, який.

дозволяє людям формувати моделі об'єктів реального мира.

Вперше ідеї ОВП були реалізовані у середині 1960;х років у мові програмування.

Симула-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 і; // Лічильник цикла.

.

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

ANSI C.

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

.

case XTYP_CONNECT:

for (і = 0; і < CTOPICS; 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 і, j;

if (uType == XTYP_WILDCONNECT).

{.

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

j = 0;

for (і = 0; і < CTOPICS; 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 формат часу для.

часов.

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)] = «.

Показати весь текст
Заповнити форму поточною роботою