Опис функцій роботи з COM-об’єктами
Одним із наріжних каменів операційної системи Windows єкомпонентна модель об'єкта(Component Object Model;COM). Ця модель стандартизує правила побудови та маніпулювання об'єктами. Переважна більшість стандартних елементів віконного інтерфейсу Windows насправді є COM-об'єктами (інша назва - ActiveX-компонент). Так, командна кнопка, поле введення, перелік є ActiveX-компонентами. Однак поняттяCOM-об'єкта суттєво ширше.COM-об'єкт може не мати графічного візуального інтерфейсу, а може бути повнофункціональним додатком Windows. Так більшість офісних продуктів Microsoft (Excel, Word, PowerPoint та ін) можуть розглядатися якCOM-об'єкти.
COM-об'єкти "живуть" у файлах типуdll,exeабоocx. Щоб джерелоCOM-об'єктів могло успішно функціонувати, він повинен бутизареєстрованийна комп'ютері. Суть реєстрації полягає в тому, що інформація проCOM-об'єкт заноситься до системного реєстру. Після реєстрації джерелоCOM-об'єктів готове до роботи.
З поглядуHomeLisp-аCOM-об'єкт - це атом, у якого встановлено певний список властивостей та стандартний індикаторCOM. Під час створення об'єктів або повернення об'єктів з методів і властивостей необхідно на місці відповідних параметрів задавати атом без списку властивостей і без індикаторів. Далі називатимемо такі атомичистими.
Усі функції маніпулювання COM-об'єктами є функціями типуSUBR(їх аргументи обчислюються).
Імена функцій маніпулювання COM-об'єктами вHomeLispдля зручності починаються префіксомCOM. Ці функції доступні у всіх режимах роботиHomeLisp, крімWEB-компоненти.
| Ім'яфункції | К-ть аргументів | Тип аргументів | Дія, що виконується |
| COMCREATEOBJECT | 2 | 1-атом; 2-STRING | Створює COM-об'єкт, ім'я якого представлене значенням ДРУГОГО аргументу. Атом-значення першого аргументу стає посиланням на створений об'єкт |
| COMDESTROYOBJECT | 1 | атом | Атом-значення аргументу повинен мати стандартний індикатор COM. Функція знищує COM-об'єкт, створений раніше викликом ComCreateObject |
| COMINTERFACE | 1 | STRING | Повертає інтерфейс COM об'єкта, заданого значенням першого параметра. |
| COMMETHOD | 2 і більше | 1-COM; 2-STRING; 3 і далі FIXED, FLOAT, BITS, STRINGS | Виклик методу об'єкту |
| COMMETHODO | 2 і більше | 1-COM; 2-STRING; 3 і далі FIXED, FLOAT, BITS, STRINGS | Виклик методу об'єкта (повертає об'єктне посилання) |
| COMPROPGET | 2 і більше | 1-COM; 2-STRING; 3 і далі FIXED, FLOAT, BITS, STRINGS | Виклик PROPERTY GET об'єкта. |
| COMPROPGETO | 2 і більше | 1-COM; 2-STRING; 3 і далі FIXED, FLOAT, BITS, STRINGS | Виклик PROPERTY GET об'єкта (з поверненням об'єктного посилання) |
| COMPROPLET | 2 і більше | 1-COM; 2-STRING; 3 і далі FIXED, FLOAT, BITS, STRINGS | Виклик PROPERTY LET об'єкта. |
ФункціяCOMCREATEOBJECTслужить створенняCOM-объекта. Функція приймає два параметри: першим параметром має бути "чистий" атом (тобто атом, що не містить у списку властивостей жодних індикаторів). Другим параметром має бути рядок виду"Ім'я_Сервера.Ім'я_Об'єкта". ЯкщоCOM-сервер, заданий ім'ям,зареєстрований на комп'ютері, буде створеноCOM-об'єкт, а атом, заданий першим параметром виклику, отримає до списку властивостей всі необхідні індикатори. Надалі всі дії зCOM-об'єктом виконуються за допомогою посилання на цей атом (який далі називатимемоідентифікатором об'єкта).
ЯкщоCOM-об'єкт створено успішно, функціяCOMCREATEOBJECTповертає ідентифікатор об'єкта.
Ось приклади виклику функціїCOMCREATEOBJECT:
Тут створюється об'єкт-додаток Excel. Запит списку властивостей ідентифікатора об'єкта показує, що об'єкт створений успішно. Далі властивостіVisibleприсвоюється значенняTrue(-1). Після цього на екрані з'являється головне меню Excel. Далі викликCOMDESTROYOBJECTзнищує програму Excel. Остання команда намагається створити незареєстрований (неіснуючий) об'єкт. Порушується стан помилки з кодом VB, що дорівнює 429.
Слід зазначити, що спроба модифікувати список властивостей ідентифікатора COM-об'єкта викликає помилку - список властивостей захищений від модифікації.
ФункціяCOMDESTROYOBJECTзнищує раніше створенийCOM-об'єкт. Єдиний аргумент цієї функції має бути ідентифікаторомCOM-об'єкта. При успішному завершенні функція повертаєT,COM-об'єкт вивантажується з пам'яті, а ідентифікатор об'єкта позбавляється списку властивостей. Якщо на вхід функціїCOMDESTROYOBJECTподано атом, що не має у списку властивостей прапораCOM, то помилкине виникає, але повертаєтьсяNil.
Все це ілюструється таким прикладом:
Видно, що після знищення об'єкта ідентифікатор об'єкта позбавляється всіх прапорів, специфічних дляCOM-об'єкта. Видно також, що спроба знищити неіснуючий об'єкт непризводить до помилки (повертаєтьсяNil).
ФункціяCOMINTERFACEдозволяє отримати у вигляді списку інтерфейс COM-об'єкта (тобто опис його властивостей та методів). Функція використовує стандартний Microsoft-компонентTLBInf32.dll(якщо цей компонент відсутній - буде порушено стан помилки).
Функція приймає один параметр типуSTRING, значення якого має мати вигляд:Ім'я_бібліотеки.Ім'я_класу. Ім'я бібліотеки - це ім'я файлу з розширеннямdll/ocx/exe, зареєстрованого на комп'ютері користувача. Функція повертає інтерфейс заданого класу як списку складної структури. На верхньому рівні цього списку є опис елементів інтерфейсу (методів і властивостей). У свою чергу, кожен елемент інтерфейсу є списком, що включає:Ім'я елемента,Тип(метод, властивість),тип значення, що повертається, іопис списку параметрів. Якщо властивість чи метод немає параметрів, то місці списку параметрів повертається атомNil.
Розглянемо конкретний приклад використання функціїCOMINTERFACE. Як зазначається у розділі, присвяченому Web-компоненті, для зв'язку web-сторінки та ядра лиспа використовується комунікаційний об'єкт. Цей об'єкт "живе" у бібліотеціTpw.dllз ім'ям класу -clsPipes. Нижче наводиться повний інтерфейс цього класу (висновок для наочності відформатовано):
Добре видно, що першими трьома методами єQueryIntreface,AddRefтаReleaseвідповідно. Ці три методи становлять непорушну основу моделіCOM. Змістовні методи класу виділені червоним кольором. Розглянемо, наприклад, перший із них -SendRequest. Метод не повертає значення (VOID) і приймає один параметр з ім'ямReqі типомBSTR. ТипBSTRце рядок у кодуванні UNICODE з попереднім двобайтовим дескриптором довжини. Наступний методGetRespповертає значення типуBSTRі не потребує параметрів.
Якщо досліджуваний клас маєвластивості, то для кожного з них в інтерфейсі буде одна або обидві процедуриProperty-Get/Property-Let. Інтерфейс цих процедур описується так само, як інтерфейс методів (ім'я - значення, що повертається - параметри). Якщо деяка властивість представлена в інтерфейсі класу обома процедурами, це властивість допускає читання і запис. Якщо є тільки процедураProperty-GET, значить властивість допускає лише читання (ReadOnly). Відповідно, наявність тільки процедуриProperty-LETозначає, що властивість допускає тільки запис (WriteOnly). Як приклад класу з властивостями можна розглянути інтерфейс класу повноекранного календаря, що міститься в бібліотеціBservy.dll(її можна завантажититут). З результату для стислості виключені стандартні методиCOMі висновок для наочності відформатовано:
Видно, що властивістьAcceptдопускає лише читання (оскільки для цієї властивості не задана процедураProperty-LET).
Залишилося сказати кілька слів про позначення типів значень, необхідних чи повертаних процедурамиCOM. Цих типів досить багато і повний їх опис читач може знайти в будь-якому посібникуCOM-моделі. Тут відзначимо, що крім описаного вище типуBSTR(UNICODE-рядок з дескриптором довжини) зустрічаються типиINTEGER(двобайтове ціле зі знаком);LONG(чотирьохбайтове ціле зі знаком);REALтаDOUBLE(відповідно чотирьох- і восьмибайтове число з плаваючою точкою);BOOL(чотирьохбайтове логічне; 0 - False; не нуль - True). ТипиUIn- це беззнакові цілі довжиноюnбайтів.
ФункціяCOMMETHODприймає два обов'язкові параметри: ідентифікаторCOM-об'єкта та ім'я методу (типуSTRING), а також змінна кількість параметрів арифметичного або рядкового типу. Функція викликає об'єкт заданого ідентифікаторомметодз ім'ям, заданим другим параметром. При цьому методу передається список параметрів, складений із параметрів функціїCOMMETHOD, починаючи з третього.
ФункціюCOMMETHODслід викликати у тому випадку, коли відповідний метод не повертає результату або повертає результат, що не є посиланням наCOM-об'єкт.
Все це ілюструється таким прикладом:
На врізці видно, як створюється додаток Microsoft Excel, робиться видимим, і викликається метод FindFile (цей метод не повертає значення). ПоверненняTозначає, що метод FindFile викликаний успішно. Далі викликається метод застосування, який перетворює сантиметри на плавці. Цей спосіб повертає значення. Спроба викликати свідомо неіснуючий метод викликає помилку. І, нарешті, викликається метод "quit" - програма завершується.
ФункціяCOMMETHODOпризначена для виклику методуCOM-об'єкта, що повертає посилання на іншийCOM-об'єкт. ФункціяCOMMETHODOприймає три обов'язкові параметри: ідентифікатор вихідногоCOM-об'єкта, ім'я методу (типуSTRING) та чистий атом, який стане ідентифікатором об'єкта, що повертається методом. Аргументи методу задаються четвертим та наступними параметрами.
Ось приклад виклику функціїCOMMETHODO:
Тут створюється програма Microsoft Word, робиться видимою, а потім створюється об'єктDocuments. Після чого викликається методAddдля об'єктаDocuments, а результат (об'єктDocument) присвоюється атомуdoc.
ФункціяCOMPROPGETприймає два параметри: ідентифікаторCOM-об'єкта та ім'я властивості (арифметичного, логічного або рядкового типу). У разі успішного завершення функція повертає значення властивості. Якщо запитаної властивості об'єкт не має, то збуджується стан помилки.
Все це ілюструється таким прикладом:
Тут властивістьVisibleвідображається в дусі Лиспа:True-TіFalse-Nil.
Призначення функціїCOMPROPGETOполягає в отриманні об'єктної властивості будь-якогоCOM-об'єкта. Наприклад,COM-об'єкт "Word.Application" має властивість-об'єктDocuments. ФункціяCOMPROPGETOприймає три обов'язкові параметри: ідентифікаторCOM-об'єкта, ім'я властивості та чистий атом, який і стане повернутим об'єктом. У разі успішного завершення функція повертає значення властивості. Якщо запитаної властивості об'єкт не має, то збуджується стан помилки.
Все це ілюструється таким прикладом:
Атомdocsстає ідентифікатором колекції документів програмиWord.Application. Для створеної програми колекція документів порожня (властивістьCountу об'єктаDocumentsдорівнює нулю).
ФункціяCOMPROPLETзабезпечує надання властивостіCOM-об'єкта значення (арифметичного, логічного чи рядкового типу). ФункціяCOMPROPLETприймає три обов'язкові параметри: ідентифікаторCOM-об'єкта, ім'я властивості та значення, яке присвоєно властивості, заданому другим параметром. У разі успішного завершення функція повертаєT. Якщо запитаноговластивості у об'єкта немає, то збуджується стан помилки.
Створюється додаток Microsoft Word і робиться видимим за допомогою присвоєння властивостіVisibleлогічного значенняTrue(-1).