- для отримання посилання на раніше запущений додаток-сервер.
Отримання ссилки на існуючий файл
Насамперед функція GETOBJECT () може бути використана для отримання посилання на файл, зареєстрований в OLE-розділі системного реєстру.
Припустимо, ви хочете відкрити файл BUDGET.XLS, який знаходиться в кореневому каталозі диска С:. Виконати це можна двома способами. Перший - створити земпляр сом-серверу Excel функцією CREATEOBJECT () і потім викликати його метод для відкриття файлу, що цікавить вас. Другий - безпосередньо відкрити файлфункцією GETOBJECT ():
oExcel = GetOBJECT("с:\budget.xls").
При цьому одночасно буде створений екземпляр об'єкту Excel, відкритий файл і одержано посилання на нього.
Зверніть увагу - Visual FoxPro навіть не довелося пояснювати, що запрошуваний файл є файлом Excel. Windows вже відомо, що файли з розширенням .xls є листами Excel, і операційна система поступає відповідно.
Якщо ситуація не так однозначна, як в даному випадку, тобто розширення імені файлу не визначає однозначно додаток, який з ним оперує, потрібне в другому параметрі виклику функції getobject () вказати ім'я СОМ-класу (додатку-серверу).
До сказаного слід додати: функція getobject () настільки кмітлива, що другий раз не запускатиме вже працюючий додаток, а приєднає до нього файл, що цікавить вас.
Отримання ссилки на раніше запущений додаток-сервер
Якщо ви бажаєте одержати тільки посилання на раніше запущений додаток-сервер, достатньо при виклику функції GETOBJECT () опустити перший параметр:
oExcel = GetOBJECT(, "Excel.Application")
Якщо виявиться, що ви "промахнулися", тобто додаток не був раніше запущено, з'явиться повідомлення про помилку OLE.
Читаючи розділ 21 ви зможете переконатися на прикладах, як зручно користуватися цією функцією для отримання посилань на додаток-сервер без запуску його додаткових екземплярів.
Команда SETOLEOBJECT
За замовчуванням Visual FoxPro шукає клас, вказаний в CREATEOBJECT (), в реєстрі Windows, якщо він не був знайдений у всіх попередніх групах класів, як про це було сказано вище. Цю функцію можна відключити установкою SET OLEOBJECT off. Фактично при цьому відключається можливість роботи з СОМ-об'єктами.
Коли в цьому може виникнути потреба? Коли ви упевнені, що з СОМ-об'єктами працювати не будете, і бажаєте зберегти час і ресурси, позбавивши систему від необхідності проглядати реєстр у пошуках того, чого там явно нема.
Якщо при цьому ви турбуєтеся про можливість роботи з елементами управління ActiveX, то цього робити не варто. Така настройка не перешкоджає роботі з ними, оскільки Visual FoxPro знає про те, що це OLE-об'єкти, і автоматично завантажує засоби підтримки OLE перед тим, як їх відкрити.
У будь-якому випадку настройка зачіпає тільки роботу з тими об'єктами, які явно специфіковані в коді програми.
І ще одне зауваження. Оскільки функція GETOBJECT () завжди має справу з OLE-об'єктами, то при установці SET OLEOBJECT OFF функція поверне код помилки.
Функція ComClassInfo ()
Функція ComClassInfo () використовується для отримання інформації з системного реєстру про раніше створені СОМ-об'єкти. Перший параметр функції, oObject, представляє ссилку на об'єкт, інформація про який вас цікавить. Другий параметр, iІnfoCode, є числом, яке визначає, яка саме інформація повинна бути витягнута. Можливі значення iІnfoCode приведені в табл. 20.1.
Таблиця 20.1. Інформація, що повертається функцією Comciassinfо () при різних значення параметра iinfoCode
Значення ilnfoCodе | Інформація, що Повертається |
1 (значення по замовчуванню) | Програмний ідентифікатор об'єкту (ProgID). Цей ідентифікатор задає вхід реєстру, який асоціюється з CLSID. Вважайте, що це ім'я, однозначне пов'язане з CLSID. Кожна версія програми має власний програмний ідентифікатор. Наприклад, ProgID для Visual FoxPro 6 буде Visual.Foxprо.Applcation.6, а для Visual FoxPro 5 - Visual.Foxprо.Application.5. Ідентифікатор ProgID також є ім'ям класу, яке можна використовувати для створення об'єкту СОМ-серверу. Наприклад, можна звернутися до createobject () таким чином:оVFP5=CREATEOBJECT("Visual.Foxpro.Application.5") оVFP6=CREATEOBJECT("Visual.Foxpro.Application.6")Але, як правило, небажано, щоб додаток був жорстко прив'язаний до певної версії , СОМ-серверу. Тому має сенс, передавши як перший параметр Visual. Foxpro .Application, запитати у реєстру, яка з версій встановлена на даному комп'ютері (а якщо встановлено декілька версій, то яка з них більш нова), і створювати об'єкт СОМ-серверу саме цієї версії |
2 | Програмний ідентифікатор, не залежний від версії (VersionlndependentProglD). VersionindepencientProgiD асоціює ProgID з CLSID. Він використовується для визначення останньої версії об'єкту додатку, посилаючись на його клас, і не змінюється від версії до версії |
3 | Оригінальне англійське ім'я об'єкту, про який прийнято говорити як про „дружнє” ім'я (friendly name) |
4 | Идентификатор класу объекта |
Ось яке значення буде повернено функцією ComClassinfo () при завданні як перший параметр Excel.Application і при різних варіантах значень другого параметра:
1 Excel.Application.8
2 Excel.Application
3 Microsoft Excel 97 Application
4 { 00024500-0000-0000-COOO-00000000004 6}
Функція CreateObjectEX ()
Як було описано вище, модель DCOM припускає, що додаток COM-серверу розміщений і виконується на різних комп'ютерах мережі. Як правило, комп’ютер клієнта конфігурується так, щоб знати, де знаходиться СОМ-сервер, і стандартна функція Createobject () може працювати без жодних додаткових фокусів. Використовування функції CreateObjectEX () дозволяє обійтися без спеціальної конфігурації комп'ютерів мережі і безпосередньо специфікувати потрібний комп'ютер.
Це дуже зручно у тому випадку, коли бажано розподілити навантаження між декількома комп'ютерами в мережі. Використовування CreateObjectEX () можливе в операційній системі Windows NT 4.0 або більш старшій версії або в Windows 95/98 зі встановленим механізмом DCOM.
Хай вас не збентежує, що при усіканні імені функції CreateObjectEX () до 13 символів воно виглядає як CreateObjectE (). Це все одно та ж сама функція CreateObjectEX().
Функція ComArray ()
В Visual FoxPro найчастіше приймається, що початковий елемент масиву має індекс 1. Але це не обов'язково. В інших мовах програмування початковий елемент має індекс 0.
Функція ComArray () дозволяє визначитися з тим, як передаватимуться масиви в СОМ-об'єкт. В результаті буде зареєстровано, яким чином здійснюється обмін масивами з конкретним COM-об'єктом.
Функція має два параметри.
oObject Посилання на СОМ-об'єкт, до якого адресується запит або який
змінюється
nSettinga Це необов'язковий числовий параметр, який визначає спосіб обміну
масивами з COM-об'єктом. В табл. 20.2 приведені його можливі
значення. Якщо цей параметр опушений, функція повертає поточну
установку для даного сом-об'єкту
Таблиця 20.2. Спосіб передачі масиву в СОМ-об'єкт при різних значенняпараметра nSettings
Значення nSettings | Опис |
0 | Перший елемент масиву має індекс 0, і масив передається в СОМ-об'єкт по значенню |
1 (за замовчуванням) | Перший елемент масиву має індекс 1, і масив передається в СОМ-об'єкт по значенню. Така настройка сумісна з попередніми версіями Visual FoxPro |
10 | Перший елемент масиву має індекс 0, і масив передається в СОМ-об'єкт по ссилці |
11 | Перший елемент масиву має індекс 1, і масив передається в СОМ-об'єкт по ссилці |
Зверніть увагу - настройка у функції сприймається системою тільки при передачі масиву в СОМ-об'єкт з використанням наступного синтаксису:
oObject.Method(@laArray)
Якщо в цьому виразі опустити символ (@), то в СОМ-об'єкт буде переданий тільки перший елемент масиву і всі настройки, виконані в ComArray (), будуть проігноровані.
Visual FoxPro як СОМ-сервер
Ми зараз, власне, розглянули, як використовувати в додатку Visual FoxPro звернення до інших СОМ-серверів. Але цим можливості СОМ-технології в поєднанні з Visual FoxPro не вичерпуються. Можна створити в середовищі Visual FoxPro власний СОМ-сервер. Про це піде мова в розділі 22. Але спочатку в розділі 21 ми розглянемо на прикладах технологію програмування додатку - клієнта СОМ в середовищі Visual FoxPro, яке здатне взаємодіяти з іншими додатками з обширного "гардероба" Microsoft Office.
Управління об'єктами СОМ-додатку
Зверніть увагу на код на самому початку програми CustRpt.PRG, який організовує запуск Excel. Спочатку викликається функція GetObject (), а потім, якщо GetObject () поверне NULL, CreateObject (). Це зроблено для того, щоб запобігти повторному запуску Excel.
Таку ж методику запуску можна застосувати і до будь-якого іншого СОМ-серверу. Тут мимовільно виникає ідея створити універсальну процедуру запуску СОМ-серверу. Програмний код такої процедури приведений в лістингу 21.5. Прогляньте цей лістинг - численні коментарі допоможуть розібратися в деталях виконання процедури.
Лістинг 21.5.21Code05 - процедура запуску СОМ-серверу
*- Програма..: GETCOMINSTANCE.PRG
*- Версія.....: 1.0
*- Автор......: Menachem Bazian, CPA
*- Дата.......: August 23, 1998
*- Проект.....: Using Visual FoxPro 6 Special Edition
*- Copyright (з) 1998 Menachem Bazian, CPA, All Rights Reserved.
*- Компілятор.: Visual FoxPro 06.00.8141.00 for Windows
*- Опис...:
*- Зміни..:
*- Універсальна процедура запуску сом-серверу.
-------------------------------------------------
LPARAMETERS tcCOMServerClass, tcDocumentFileName
*- Параметр tcCOMServerClass - ім'я класу СОМ-серверу
*- об'єкт якого необхідно створити.
*- Наприклад "excel.application".
*- Перевіримо, чи переданий перший параметр.
ASSERT TYPE(“tcCOMServerClass") = "С";
MESSAGE "You must provide а character parameter to
GETCOMINSTANCE. "
IF PCOUNT () = 0 OR TYPE ("tcCOMServerClass") # "c"
RETURN .NULL.
ENDIF
*- Раз ми сюди дійшли, значить параметр переданий правильно
*- і можна спробувати створити об'єкт COM-серверу.
*- Спробуємо це зробити за допомогою GETObject ()
LOCAL loCOMInstance, lcOldError
lcOldError = ON("ERROR")
*- Перевіримо, чи переданий другий параметр.
*- Якщо параметр - ім'я файлу - переданий, то потрібно сформувати