1. Що таке порт
2.Деякі правила для роботи з портами
Слід мати на увазі що при розробці програм мають справу роботи з портами слід враховувати наступні фактори:
Намагатися використовувати функції високого рівня для доступу до портів (зокрема WinAPI) і не вдаватися до низькорівневих операцій читання / запису портів. Якщо ви все-таки вирішили писати низькорівневе читання те ці процедури потрібно виносити в окрему DLL або VXD, з наступних причин - відомо, що операційна система Windows95 / 98 а особливо NT є по своїй суті багатозадачними системами. Тобто якщо ваша програма звертається конкретно до порту НЕ через динамічний виклик функції DLL або VXD (використання механізму DLL) а безпосередньо то це може позначитися на коректній роботі системи або навіть завалити її. І навіть якщо в Windows95 / 98 такий підхід цілком може працювати то в Windows NT внаслідок його архітектури не вирішить безпосереднє читання / запис безпосередньо, а використання механізму DLL або VXD дозволяє обійти цю проблему.
Якщо ви працюєте з якимось нестандартним портом введення-виведення (наприклад портом що зберігає стан кнопок пульта ДУ TVTunera то напевно в комплекті поставки рідного софта знайдеться DLL або VXD для управління цим пристроєм і відпаде потреба писати код, так я при роботі з пультом ДУ TVTunerа використовую стандартну DLL поставляється в комплекті, це відразу вирішило питання пов'язані з управлінням портами даного тюнера)
Отже, відступ - трохи практики ...
function PortInit: boolean; // ініціалізація
f: = Windows.CreateFile (PChar ( 'COM1'), GENERIC_READ or
FILE_SHARE_READ or FILE_SHARE_WRITE,
GENERIC_WRITE, 0, nil,
Покажчик на рядок з нульовим символом в кінці (PCHAR), яка визначає назву створюваного об'єкту (файл, канал, поштовий слот, ресурс зв'язку (в даному випадку порти), накопичувач на комп'ютері, приставка, або каталог)
Вказує тип доступу до об'єкта, приймає значення
GENERIC_READ - для читання
GENERIC_WRITE - для запису (змішування з GENERIC_READ операцією GENERIC_READ and GENERIC_WRITE предостовляет повний доступ)
Набір розрядних прапорів, які визначають як об'єкт може бути розділений по доступу до нього. Якщо dwShareMode - 0, об'єкт не може бути розділений. Послідовні операції відкриття об'єкту терпітимуть невдачу, поки маркер (дескриптор) відкритого об'єкта не буде закритий. Фактично надається монопольний доступ.
Щоб розділяти об'єкт (мета), використовуйте комбінацію одних або більшу кількість наступних значень:
FILE_SHARE_DELETE (Тільки для Windows NT)
Покажчик на структуру SECURITY_ATTRIBUTES, яка визначає може повернений дескриптор бути успадкований дочірніми процесами. Якщо lpSecurityAttributes НУЛЬОВИЙ, маркер не може бути успадкований. Використовується тільки в windows NT.
Визначає поведінку функції якщо об'єкт вже існує і як він буде відкритий в цьому випадку Приймає одне з наступних значень:
Створює новий об'єкт (файл) Видає помилку якщо вказаний об'єкт (файл) вже існує.
Створює новий об'єкт (файл) Функція перезаписує існуючий об'єкт (файл)
Відкриває об'єкт (файл) Видає помилку якщо вказаний об'єкт (файл) не існує. (Для більш детального дивіться SDK)
Відкриває об'єкт (файл), якщо він існує. Якщо об'єкт (файл) не існує, функція створює його, як ніби dwCreationDistribution були CREATE_NEW.
Відкриває об'єкт (файл). Після цього об'єкт (файл) буде усічений до нульового розміру.Видає помилку якщо вказаний об'єкт (файл) не існує.
Атрибути об'єкта (файлу), атрибути можуть комбінуватися
Визначає дескриптор з GENERIC_READ доступом до тимчасового об'єкту (файлу). Тимчасовий об'єкт (файл) поставляє атрибути файлу і розширені атрибути для створюваного об'єкта (файлу) ВИКОРИСТОВУЄТЬСЯ ТІЛЬКИ В WINDOWS NT Windows 95: Це значення повинно бути встановлено в Nil.
Якщо функція досягає успіху, повертається значення - відкритий дескриптор до вказаного об'єкту (файлу). Якщо файл не існує - 0.
Якщо відбулися функціональні збої, повертається значення - INVALID_HANDLE_VALUE. Щоб отримати розширені дані про помилки, викличте GetLastError.
Для портів, dwCreationDistribution параметр повинен бути OPEN_EXISTING, і hTemplate повинен бути Nil. Доступ для читання-запису повинен бути визначений явно.
Структура містить опис захисту для об'єкту і визначає, чи може дескриптор бути успадкований дочірніми процесами.
typedef struct _SECURITY_ATTRIBUTES
Визначає розмір, в байтах, цієї структури. Набір це значення до розміру структури SECURITY_ATTRIBUTES У Windows NT функції які використовують структуру SECURITY_ATTRIBUTES, не перевіряють значення nLength.
Дескриптор вказує на описувач захисту для об'єкта, Якщо дескриптор ПОРОЖНІЙ об'єкт може бути призначений в спадкоємство дочірніми процесами.
Визначає, чи успадкований повернений дескриптор, коли новий дескриптор, створений. Якщо це значення приймає істину новий дескриптор успадковує від головного.
Покажчик на структуру SECURITY_ATTRIBUTES використовується як параметр в більшості функцій роботи з вікнами в Win32 API.