fieldbusbook

Посібник по промисловим мережам

Промислові мережі та інтеграційні технології в автоматизованих системах. 12. ВІДКРИТІ ТЕХНОЛОГІЇ ПРОГРАМНОЇ ІНТЕГРАЦІЇ В СЕРЕДОВИЩІ WINDOWS

12.3. Інтерфейс програми користувача до ОС Windows

12.3.1. Win32 API

Для того, щоб програми користувача могли використовувати ресурси операційної системи, вона надає їм певний інтерфейс. Інтерфейс доступу прикладних програм до об’єктів якої-небудь програмної системи називають АРІ (Application Programming Interface). Інтерфейси прикладних програм представляють собою набір функцій, які забезпечують сервіси даної програми. У 32-х розрядних операційних системах Windows (х86), програмний інтерфейс має назву Win32 API. Хоча функції для всіх Win32-систем в основній масі перекриваються (однакові), реалізація їх різна, оскільки ядра в операційних системах відрізняються. Тому деякі прикладні програми добре функціонують у Windows системах, а деякі ведуть себе специфічно або взагалі не працюють на одній із них.

АРІ-функції Windows входять в складу бібліотек з динамічним підключенням типу DLL (Dynamic Link Library), які являються підсистемою середовища Win32 . Бібліотеки DLL – це виконавчий файл, який вміщує декілька експортних функцій (exportable functions), тобто функцій, до яких можуть звертатися інші виконавчі прикладні програми (EXE або DLL). Такі бібліотеки можуть викликатися за необхідністю, тобто при виконанні експортованих функцій, які там знаходяться. В цьому випадку бібліотека проектується на адресний простір Процесу того Потоку, який викликав її функцію. Будь яка прикладна програма може скористатися експортними функціями dll-бібліотеки, якщо в ній правильно об’явлений виклик і вірно передані всі фактичні параметри. Це значить, що при описі функцій бібліотеки, він може ними скористатися просто викликавши їх.

АРІ функції імпортуються прикладною програмою з декількох бібліотек DLL:

Приклад 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

12.3.2. Проблеми доступу до даних іншого Процесу.

Кожний із Процесів в операційній системі має свій адресний простір, тому передача даних між двома різними Процесами – задача не тривіальна і вирішується декількома шляхами. Спеціалістам з автоматизації більш цікаві стандартні підходи, які не потребують написання програм (принаймні складних), а тільки конфігурування для кожного з процесів. Наприклад, для зв’язку таблиці Excel з потрібними даними в базі даних Access, з подальшим автоматичним відновленням інформації, можна скористатися ресурсами самого Excel. Для того, щоб гнучко використовувати такі вбудовані в програмні засоби можливості, необхідне розуміння внутрішньої сутності функціонування. В зв’язку з цим коротко розглянемо базові поняття функціонування відкритих технологій міжпрограмної (міжпроцесної) взаємодії, а саме DDE/NetDDE, COM/DCOM та WEB технології.

<– 12.2. Функціонування ОС Window

–> 12.4. Технології DDE та NetDDE