Delphi. Файлова система. порти
1. Що таке порт
2.Деякі правила для роботи з портами
Слід мати на увазі що при розробці програм мають справу роботи з портами слід враховувати наступні фактори.
- Намагатися використовувати функції високого рівня для доступу до портів (зокрема WinAPI) і не вдаватися до низькорівневих операцій читання / запису портів. Якщо ви все-таки вирішили писати низькорівневе читання те ці процедури потрібно виносити в окрему DLL або VXD, з наступних причин - відомо, що операційна система Windows95 / 98 а особливо NT є по своїй суті багатозадачними системами. Тобто якщо ваша програма звертається конкретно до порту НЕ через динамічний виклик функції DLL або VXD (використання механізму DLL) а безпосередньо то це може позначитися на коректній роботі системи або навіть завалити її. І навіть якщо в Windows95 / 98 такий підхід цілком може працювати то в Windows NT внаслідок його архітектури не вирішить безпосереднє читання / запис безпосередньо, а використання механізму DLL або VXD дозволяє обійти цю проблему.
- Якщо ви працюєте з якимось нестандартним портом введення-виведення (наприклад портом що зберігає стан кнопок пульта ДУ TVTunera то напевно в комплекті поставки рідного софта знайдеться DLL або VXD для управління цим пристроєм і відпаде потреба писати код, так я при роботі з пультом ДУ TVTunerа використовую стандартну DLL поставляється в комплекті, це відразу вирішило питання пов'язані з управлінням портами даного тюнера)
Отже, відступ - трохи практики ...
Даний приклад було взято мною з численний FAQ присвячених в DELPHI в мережі ФИДО Отже, для роботи з портами COM і LPT нам знадобиться знання функцій Windows API.
Ось докладний опис функцій, які нам потрібні (в еквіваленті C) для роботи з портами. (Вибачте за можливий місцями неточний переклад, якщо що поправте мене якщо що не так перевів)
Приклад коду на Дельфі
Покажчик на рядок з нульовим символом в кінці (PCHAR). яка визначає назву створюваного об'єкту (файл, канал, поштовий слот, ресурс зв'язку (в даному випадку порти), накопичувач на комп'ютері, приставка, або каталог)
Вказує тип доступу до об'єкта, приймає значення
GENERIC_READ - для читання
GENERIC_WRITE - для запису (змішування з GENERIC_READ операцією GENERIC_READ and GENERIC_WRITE предостовляет повний доступ)
Набір розрядних прапорів, які визначають як об'єкт може бути розділений по доступу до нього. Якщо dwShareMode - 0, об'єкт не може бути розділений. Послідовні операції відкриття об'єкту терпітимуть невдачу, поки маркер (дескриптор) відкритого об'єкта не буде закритий. Фактично надається монопольний доступ.
Щоб розділяти об'єкт (мета), використовуйте комбінацію одних або більшу кількість наступних значень:
FILE_SHARE_DELETE (Тільки для Windows NT)
FILE_SHARE_READ
FILE_SHARE_WRITE
Покажчик на структуру SECURITY_ATTRIBUTES, яка визначає може повернений дескриптор бути успадкований дочірніми процесами. Якщо lpSecurityAttributes НУЛЬОВИЙ, маркер не може бути успадкований. Використовується тільки в windows NT.
Визначає поведінку функції якщо об'єкт вже існує і як він буде відкритий в цьому випадку Приймає одне з наступних значень.
CREATE_NEW
Створює новий об'єкт (файл) Видає помилку якщо вказаний об'єкт (файл) вже існує.
CREATE_ALWAYS
Створює новий об'єкт (файл) Функція перезаписує існуючий об'єкт (файл)
OPEN_EXISTING
Відкриває об'єкт (файл) Видає помилку якщо вказаний об'єкт (файл) не існує. (Для більш детального дивіться SDK)
OPEN_ALWAYS
Відкриває об'єкт (файл), якщо він існує. Якщо об'єкт (файл) не існує, функція створює його, як ніби dwCreationDistribution були CREATE_NEW.
TRUNCATE_EXISTING
Відкриває об'єкт (файл). Після цього об'єкт (файл) буде усічений до нульового розміру.Видає помилку якщо вказаний об'єкт (файл) не існує.
Атрибути об'єкта (файлу). атрибути можуть комбінуватися
FILE_ATTRIBUTE_ARCHIVE
FILE_ATTRIBUTE_COMPRESSED
FILE_ATTRIBUTE_HIDDEN
FILE_ATTRIBUTE_NORMAL
FILE_ATTRIBUTE_OFFLINE
FILE_ATTRIBUTE_READONLY
FILE_ATTRIBUTE_SYSTEM
FILE_ATTRIBUTE_TEMPORARY
Визначає дескриптор з GENERIC_READ доступом до тимчасового об'єкту (файлу). Тимчасовий об'єкт (файл) поставляє атрибути файлу і розширені атрибути для створюваного об'єкта (файлу) ВИКОРИСТОВУЄТЬСЯ ТІЛЬКИ В WINDOWS NT Windows 95: Це значення повинно бути встановлено в Nil.
Якщо функція досягає успіху, повертається значення - відкритий дескриптор до вказаного об'єкту (файлу). Якщо файл не існує - 0.
Якщо відбулися функціональні збої, повертається значення - INVALID_HANDLE_VALUE. Щоб отримати розширені дані про помилки, викличте GetLastError.
Для портів, dwCreationDistribution параметр повинен бути OPEN_EXISTING, і hTemplate повинен бути Nil. Доступ для читання-запису повинен бути визначений явно.
Структура містить опис захисту для об'єкту і визначає, чи може дескриптор бути успадкований дочірніми процесами.
NLength
Визначає розмір, в байтах, цієї структури. Набір це значення до розміру структури SECURITY_ATTRIBUTES У Windows NT функції які використовують структуру SECURITY_ATTRIBUTES, не перевіряють значення nLength.
LpSecurityDescriptor
Дескриптор вказує на описувач захисту для об'єкта, Якщо дескриптор ПОРОЖНІЙ об'єкт може бути призначений в спадкоємство дочірніми процесами.
BInheritHandle
Визначає, чи успадкований повернений дескриптор, коли новий дескриптор, створений. Якщо це значення приймає істину новий дескриптор успадковує від головного.
Покажчик на структуру SECURITY_ATTRIBUTES використовується як параметр в більшості функцій роботи з вікнами в Win32 API.