Посібник по промисловим мережам
Промислові мережі та інтеграційні технології в автоматизованих системах. 12. ВІДКРИТІ ТЕХНОЛОГІЇ ПРОГРАМНОЇ ІНТЕГРАЦІЇ В СЕРЕДОВИЩІ WINDOWS
Для того, щоб програми користувача могли використовувати ресурси операційної системи, вона надає їм певний інтерфейс. Інтерфейс доступу прикладних програм до об’єктів якої-небудь програмної системи називають АРІ (Application Programming Interface). Інтерфейси прикладних програм представляють собою набір функцій, які забезпечують сервіси даної програми. У 32-х розрядних операційних системах Windows (х86), програмний інтерфейс має назву Win32 API. Хоча функції для всіх Win32-систем в основній масі перекриваються (однакові), реалізація їх різна, оскільки ядра в операційних системах відрізняються. Тому деякі прикладні програми добре функціонують у Windows системах, а деякі ведуть себе специфічно або взагалі не працюють на одній із них.
АРІ-функції Windows входять в складу бібліотек з динамічним підключенням типу DLL (Dynamic Link Library), які являються підсистемою середовища Win32 . Бібліотеки DLL – це виконавчий файл, який вміщує декілька експортних функцій (exportable functions), тобто функцій, до яких можуть звертатися інші виконавчі прикладні програми (EXE або DLL). Такі бібліотеки можуть викликатися за необхідністю, тобто при виконанні експортованих функцій, які там знаходяться. В цьому випадку бібліотека проектується на адресний простір Процесу того Потоку, який викликав її функцію. Будь яка прикладна програма може скористатися експортними функціями dll-бібліотеки, якщо в ній правильно об’явлений виклик і вірно передані всі фактичні параметри. Це значить, що при описі функцій бібліотеки, він може ними скористатися просто викликавши їх.
АРІ функції імпортуються прикладною програмою з декількох бібліотек DLL:
KERNEL32.DLL – вміщує біля 700 функцій, які призначені для управління пам’яттю, процесами та потоками;
USER32.DLL – надає біля 600 функцій для управління інтерфейсом користувача, наприклад створенням вікон та передачею повідомлень;
GDI.DLL – експортує біля 400 функцій для малювання графічних образів, відображення тексту та роботи зі шрифтами;
COMDLG32.DLL – відкриває доступ до майже 20 функцій управління стандартними діалоговими вікнами Windows;
LZ32.DLL – зберігає біля 10 функцій архівування і розархівування файлів;
ADVAPI32.DLL – експортує біля 400 функцій, пов’язаних з захистом об’єктів та роботи з реєстром;
WINM.DLL – вміщує біля 200 функцій, які відносяться до мультимедіа.
Приклад 12.1. Технології програмної інтеграції. Функція для створення процесу з відповідним об’єктом ядра “процес”.
Завдання. Створити функцію для створення процесу з використанням VB/VBA.
Рішення. Використаємо API-функцію CreateProcess, більшу частину аргументів яких треба просто проініціалізувати по замовченню.
Public Declare Function CreateProcess Lib "kernel32" Alias "CreateProcessA" _
(ByVal lpApplicationName As String, _
ByVal lpCommandLine As String, _
lpProcessAttributes As SECURITY_ATTRIBUTES, _
lpThreadAttributes As SECURITY_ATTRIBUTES, _
ByVal bInheritHandles As Long, _
ByVal dwCreationFlags As Long, _
lpEnvironment As Any, _
ByVal lpCurrentDriectory As String, _
lpStartupInfo As STARTUPINFO, _
lpProcessInformation As PROCESS_INFORMATION) _
As Long
Де: lpApplicationName – ім’я файла. Якщо файл знаходиться в плинній директорії краще задавати ім’я в наступному полі, а в цьому вказувати vbNullString; lpCommandLine – ім’я файла в форматі повного командного рядку. Якщо рядок не вказаний, то він шукає в локальному, системному, основному каталозі Windows. Використовується якщо lpApplicationName= vbNullString; lpProcessAttributes – атрибути захисту для дочірнього процесу. Як правило треба вказати змінну, яку попередньо об’явити з типом SECURITY_ATTRIBUTES; lpThreadAttributes – атрибути захисту для дочірнього потоку. Як правило треба вказати змінну, яку попередньо об’явити з типом SECURITY_ATTRIBUTES; bInheritHandles – наслідувати чи ні дескриптори. Вказуйте FALSE; dwCreationFlags – визначає прапорці, які впливають на те, як саме створюється новий процес. lpEnvironment – область пам’яті з окружними змінними (Передавайте 0); lpCurrentDriectory – поточний диск і каталог створюваному процесу. Як правило передається 0; lpStartupInfo – параметри, які передаються створюваному процесу. Навіть якщо треба створити процес з параметрами по замовченню, необхідно проініціалізувати цю структуру і в ній вказати розмір (cb); lpProcessInformation – через цю структурну змінну функція повертає значення дескрипторів і ідентифікаторів процесу, що створюється, та його первинного потоку.
Декілька прапорців об’єднуються через OR. Серед корисних можна виділити ті, які задають базовий пріоритет процесу: IDLE_PRIORITY_CLASS (&H40); NORMAL_PRIORITY_CLASS (&H20); HIGH_PRIORITY_CLASS (&H80); REALTIME_PRORITY_CLASS (&H100).
Таким чином приклад на VB буде мати наступний вигляд.
Деклараційна частина:
Public Type SECURITY_ATTRIBUTES ' атрибути захисту об’єктів ядра
nLength As Long
lpSecurityDescriptor As Long
bInheritHandle As Long
End Type
Public Type PROCESS_INFORMATION
hProcess As Long 'дескриптор процесу
hThread As Long 'дескриптор первинного потоку
dwProcessId As Long 'ідентифікатор процесу
dwThreadId As Long 'ідентифікатор потоку
End Type
Public Type STARTUPINFO '
cb As Long 'розмір даної структури (для контролю версій)
lpReserved As String
lpDesktop As String
lpTitle As String
dwX As Long
dwY As Long
dwXSize As Long
dwYSize As Long
dwXCountChars As Long
dwYCountChars As Long
dwFillAttribute As Long
dwFlags As Long
wShowWindow As Integer
cbReserved2 As Integer
lpReserved2 As Long
hStdInput As Long
hStdOutput As Long
hStdError As Long
End Type
Public Declare Function CreateProcess Lib "kernel32" Alias "CreateProcessA" _
(ByVal lpApplicationName As String, _
ByVal lpCommandLine As String, _
lpProcessAttributes As SECURITY_ATTRIBUTES, _
lpThreadAttributes As SECURITY_ATTRIBUTES, _
ByVal bInheritHandles As Long, _
ByVal dwCreationFlags As Long, _
lpEnvironment As Any, _
ByVal lpCurrentDriectory As String, _
lpStartupInfo As STARTUPINFO, _
lpProcessInformation As PROCESS_INFORMATION) _
As Long
Виконавча частина:
Sub CreateProc(ByVal file1 As String)
Dim StartInfo As STARTUPINFO, Pi As PROCESS_INFORMATION
Dim thrSA As SECURITY_ATTRIBUTES
Dim procSA As SECURITY_ATTRIBUTES
With StartInfo
.cb = LenB(StartInfo)
End With
CreateProcess (vbNullString, file1, procSA, thrSA, False, _
0, 0, vbNullString, StartInfo, Pi)
End Sub
Кожний із Процесів в операційній системі має свій адресний простір, тому передача даних між двома різними Процесами – задача не тривіальна і вирішується декількома шляхами. Спеціалістам з автоматизації більш цікаві стандартні підходи, які не потребують написання програм (принаймні складних), а тільки конфігурування для кожного з процесів. Наприклад, для зв’язку таблиці Excel з потрібними даними в базі даних Access, з подальшим автоматичним відновленням інформації, можна скористатися ресурсами самого Excel. Для того, щоб гнучко використовувати такі вбудовані в програмні засоби можливості, необхідне розуміння внутрішньої сутності функціонування. В зв’язку з цим коротко розглянемо базові поняття функціонування відкритих технологій міжпрограмної (міжпроцесної) взаємодії, а саме DDE/NetDDE, COM/DCOM та WEB технології.
<– 12.2. Функціонування ОС Window
–> 12.4. Технології DDE та NetDDE