Книжная полка Сохранить
Размер шрифта:
А
А
А
|  Шрифт:
Arial
Times
|  Интервал:
Стандартный
Средний
Большой
|  Цвет сайта:
Ц
Ц
Ц
Ц
Ц

Программирование

Покупка
Основная коллекция
Артикул: 779423.01.99
В пособии описаны методы и средства разработки многозадачного и многопоточного программного обеспечения в операционных системах семейства Windows, средства межзадачной и межпоточной коммуникации: анонимные и именованные каналы, почтовые ящики, отображаемые на память файлы, события, семафоры, взаимные исключения. Кроме того, кратко обсуждаются средства коммуникации процессов по сети, а также особенности взаимодействия приложений и системных служб. Приводятся примеры реализации программ и даются задания для самостоятельной работы, включая варианты повышенной сложности. Рекомендовано студентам ряда технических специальностей, связанных с разработкой многозадачного и многопоточного программного обеспечения в среде операционных систем семейства Windows. Работа подготовлена на кафедре автоматики и утверждена Редакционно-издательским советом университета в качестве учебно-методического пособия для студентов II курса, обучающихся по направлениям 27.03.04 «Управление в технических системах» и 09.03.01 «Информатика и вычислительная техника».
Гунько, А. В. Программирование : учебно-методическое пособие / А. В. Гунько. - Новосибирск : Изд-во НГТУ, 2019. - 74 с. - ISBN 978-5-7782-3961-6. - Текст : электронный. - URL: https://znanium.com/catalog/product/1870335 (дата обращения: 17.05.2024). – Режим доступа: по подписке.
Фрагмент текстового слоя документа размещен для индексирующих роботов. Для полноценной работы с документом, пожалуйста, перейдите в ридер.
Министерство науки и высшего образования Российской Федерации 
 
НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ 

 
 
 
 
 
 
 
 
А.В. ГУНЬКО 
 
 
 
 
 
 
ПРОГРАММИРОВАНИЕ 
 
Учебно-методическое пособие 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
НОВОСИБИРСК 
2019 

 

УДК 004.45 (075.8) 
          Г 948 
 

Рецензенты: 

канд. техн. наук, доцент В.А. Астапчук 
канд. техн. наук, доцент Г.В. Саблина 
 
 
Гунько А.В. 
Г 948   
Программирование: 
учебно-методическое 
пособие 
/  
А.В. Гунько. – Новосибирск: Изд-во НГТУ, 2019. – 74 с. 

        ISBN 978-5-7782-3961-6 

В пособии описаны методы и средства разработки многозадачного 

и многопоточного программного обеспечения в операционных системах семейства Windows, средства межзадачной и межпоточной коммуникации: анонимные и именованные каналы, почтовые ящики, отображаемые на память файлы, события, семафоры, взаимные исключения. 

Кроме того, кратко обсуждаются средства коммуникации процес
сов по сети, а также особенности взаимодействия приложений и системных служб. Приводятся примеры реализации программ и даются 
задания для самостоятельной работы, включая варианты повышенной 
сложности. 

Рекомендовано студентам ряда технических специальностей, свя
занных с разработкой многозадачного и многопоточного программного обеспечения в среде операционных систем семейства Windows. 
 
Работа подготовлена на кафедре автоматики и утверждена  
Редакционно-издательским советом университета в качестве 
учебно-методического пособия для студентов II курса,  
обучающихся по направлениям 27.03.04 «Управление в технических  
системах» и 09.03.01 «Информатика и вычислительная техника» 
 
 
УДК 004.45 (075.8) 
 
ISBN 978-5-7782-3961-6  
 
 
 
 
 
© Гунько А.В., 2019 
© Новосибирский государственный  
    технический университет, 2019 

 


Т е м а  1 

ФАЙЛОВЫЕ ОПЕРАЦИИ WinAPI 

Цель работы: изучить особенности выполнения операций с файлами средствами WinAPI на языке C в операционных системах семейства Windows. 

Краткие теоретические сведения 

Операции открытия, чтения, записи и закрытия файлов 
Прежде всего, приложение должно открыть файл при помощи функции CreateFile. Ниже приведен прототип этой функции: 
 
HANDLE CreateFile( 
LPCTSTR lpFileName,  
 
// адрес строки имени файла 
DWORD   dwDesiredAccess, // режим доступа 
DWORD   dwShareMode,  
 
// режим совместного 
// использования файла 
LPSECURITY_ATTRIBUTES lpSecurityAttributes,  
// дескриптор защиты 
DWORD  dwCreationDistribution,  // параметры создания 
DWORD  dwFlagsAndAttributes,  // атрибуты файла 
HANDLE hTemplateFile);  
 
 
 // идентификатор файла 
 с атрибутами 
 
Через параметр lpFileName этой функции передается адрес текстовой строки с завершающим нулевым символом, содержащей путь и имя 
файла, канала или любого другого именованного объекта, который 
необходимо открыть или создать. Допустимое количество символов при 

указании путей доступа обычно ограничивается значением МАХ_РАТН 
(260). 
С помощью параметра dwDesiredAccess следует указать нужный 
вид доступа. Если файл будет открыт только для чтения, в этом параметре необходимо указать флаг GENERIC_READ. Если необходимо выполнять над файлом операции чтения и записи, следует указать логическую комбинацию флагов GENERIC_READ и GENERIC_WRITE. В том случае, когда будет указан только флаг GENERIC_WRITE, операция чтения 
из файла будет запрещена. 
Если файл будет использоваться одновременно несколькими  
процессами, через параметр dwShareMode необходимо передать режимы совместного использования файла: FILE_SHARE_READ или 
FILE_SHARE_WRITE. 
Через параметр lpSecurityAttributes необходимо передать указатель на дескриптор защиты или значение NULL, если этот дескриптор 
не используется. 
Параметр dwCreationDistribution определяет действия, выполняемые функцией CreateFile, если приложение пытается создать 
файл, который уже существует. 
Параметр dwFlagsAndAttributes задает атрибуты и флаги для 
файла. Атрибуты являются характеристиками файла (а не открытого дескриптора) и игнорируются, если открывается существующий файл. Для 
создания нового файла рекомендуется атрибут FILE_ATTRIBUTE_ 
NORMAL, который можно использовать только отдельно. 
Последний параметр, hTemplateFile, предназначен для доступа к 
файлу шаблона с расширенными атрибутами для создаваемого файла. 
Этот параметр здесь не рассматривается. 
В случае успешного завершения функция CreateFile возвращает 
идентификатор открытого файла. При ошибке возвращается значение 
INVALID_HANDLE_VALUE. 
Для закрытия объектов любого типа, объявления недействительными их дескрипторов и освобождения системных ресурсов почти во 
всех случаях используется одна и та же универсальная функция: 

BOOL CloseHandle (HANDLE hObject); 

Единственный параметр hObject – дескриптор объекта любого 
типа. Возвращаемое значение: в случае успешного выполнения функции – TRUE, иначе – FALSE. Попытки закрытия недействительных дескрипторов или повторного закрытия одного и того же дескриптора 
приводят к исключениям. 
Чтение из файла производится функцией 

BOOL ReadFile (HANDLE hFile, LPVOID lpBuffer, DWORD 
nNumberOfBytesToRead, 
LPDWORD 
lpNumberOfBytesRead, 
LPOVERLAPPED lpOverlapped); 

Здесь параметр hFile – дескриптор считываемого файла, который 
должен быть создан с правами доступа GENERIC_READ. Параметр 
lpBuffer является указателем на буфер в памяти, куда помещаются 
считываемые данные. Параметр nNumberOfBytesToRead – количество байтов, которые должны быть считаны из файла. Параметр 
lpNumberOfBytesRead – указатель на переменную, предназначенную 
для хранения числа байтов, которые были фактически считаны в результате вызова функции ReadFile. Этот параметр может принимать нулевое значение, если перед выполнением чтения указатель файла был позиционирован в конце файла или если во время чтения возникли 
ошибки, а также после чтения из именованного канала, работающего в 
режиме обмена сообщениями (работа с каналами описана далее), если 
переданное сообщение имеет нулевую длину. 
Параметр lpOverlapped – указатель на структуру OVERLAPPED. 
Используется для организации асинхронного режима чтения (записи). 
Если запись выполняется синхронно, в качестве этого параметра следует указать значение NULL. Для использования асинхронного режима 
файл должен быть открыт функцией CreateFile с использованием 
флага FILE_FLAG_OVERLAPPED. Если указан этот флаг, параметр 
lpOverlapped не может иметь значение NULL. Он обязательно должен 
содержать адрес подготовленной структуры типа OVERLAPPED. 

Возвращаемое функцией значение в случае успешного выполнения 

(которое считается таковым, даже если не был считан ни один байт изза попытки чтения с выходом за пределы файла) – TRUE, иначе – FALSE. 

Если значения дескриптора файла или иных параметров, используе
мых при вызове функции, оказались недействительными, возникает 
ошибка и функция возвращает значение FALSE. Попытка выполнения 
чтения в ситуациях, когда указатель файла позиционирован в конце 

файла, не приводит к ошибке; вместо этого количество считанных байтов (*lpNumberOfBytesRead) устанавливается равным нулю. 
Запись в файл производится функцией 

BOOL WriteFile(HANDLE hFile, LPVOID lpBuffer, DWORD 
nNumberOfBytesToWrite, 
LPDWORD 
lpNumberOfBytesWrite, 
LPOVERLAPPED lpOverlapped); 

Ее параметры аналогичны параметрам функции чтения из файла. 
Возвращаемое значение в случае успешного выполнения – TRUE, 
иначе – FALSE. Успешное выполнение записи еще не говорит о том, что 
данные действительно оказались записанными на диск, если только при 
создании файла с помощью функции СrеateFile не был использован 
флаг FILE_FLAG_WRITE_THROUGH. Если во время вызова функции указатель файла был позиционирован в конце файла, Windows увеличит 
длину существующего файла. 

Методические указания 

1. Проект может быть реализован в среде Visual C++ или Borland 
C++ 5.0 и выше. В первом случае выбирается консольное приложение 
Win32 без дополнительных библиотек. В любом случае в программу 
необходимо добавить файл включения windows.h. 
2. Проект должен предусматривать обработку исключительных ситуаций (отсутствие входных параметров, отсутствие обрабатываемого 
файла, ошибки создания выходного файла и записи в него). 
3. Пример кода (file.cpp) программы доступен по адресу http://gun. 
cs.nstu.ru/winprog/file.cpp. 

Порядок выполнения работы 

1. Написать и отладить программу, получающую в аргументах командной строки имя существующего текстового файла и символ (или 
число), используемый для обработки файла. 
2. Результатом работы программы является выходной текстовый 
файл с тем же именем, что и входной, но с другим типом (расширением), 
содержащий текст, обработанный согласно вариантам (табл. 1), возвращаемое значение – количество выполненных операций или «–1» в случае ошибки. 

Варианты заданий 

Т а б л и ц а  1 

Задание 
Параметры 
командной строки 

1. Удалить из текста заданный символ 
1. Имя входного файла 
2. Заданный символ 

2. В конце каждой строки вставить заданный символ 
1. Имя входного файла 
2. Заданный символ 

3. Заменить цифры на пробелы 
1. Имя входного файла 
2. Количество замен 

4. Заменить знаки на заданный символ 
1. Имя входного файла 
2. Заданный символ 

5. Заменить каждый пробел на два 
1. Имя входного файла 
2. Количество замен 

6. После каждой точки вставить символ ‘\n’ 
1. Имя входного файла 
2. Количество замен 

7. Удалить из текста все пробелы 
1. Имя входного файла 
2. Количество замен 

8. Заменить заданные символы на пробелы 
1. Имя входного файла 
2. Заданный символ 

9. После каждого пробела вставить точку 
1.Имя входного файла 
2. Количество вставок 

10. Заменить все пробелы первым символом текста 
1. Имя входного файла 
2. Максимальное количество замен 

11. Во всех парах одинаковых символов второй символ 
заменить на пробел 
1. Имя входного файла 
2. Количество замен 

12. Заменить на пробелы все символы, совпадающие  
с первым символом в строке 
1. Имя входного файла 
2. Количество замен 

13. Заменить заданную пару букв на символы #@ 
1. Имя входного файла 
2. Заданная пара букв 

14. Заменить все цифры заданным символом 
1. Имя входного файла 
2. Заданный символ 

15. Заменить на пробел все символы, совпадающие 
с последним символом в строке 
1. Имя входного файла 
2. Количество замен 

16. Заменить все символы с кодами меньше 48 на пробелы 1. Имя входного файла 
2. Количество замен 

17. Заменить все символы с кодами больше 48 на пробелы 1. Имя входного файла 
2. Количество замен 

О к о н ч а н и е  т а б л .  1 

Задание 
Параметры  
командной строки 

18. Заменить каждый третий символ на пробел 
1. Имя входного файла 
2. Количество замен 

19. Заменить все пробелы на заданный символ 
1. Имя входного файла 
2. Заданный символ 

20. Заменить все пары одинаковых символов на пробелы 
1. Имя входного файла 
2. Количество замен 

Содержание отчета 

1. Цель работы. 
2. Вариант задания. 
3. Листинг программы. 

Контрольные вопросы 

1. Что такое API? На какие категории подразделяется WinAPI? 
2. Перечислите принципы, лежащие в основе WinAPI. 
3. Перечислите преимущества и недостатки реализации файловых 
операций средствами стандартной библиотеки С и WinAPI. 
4. Перечислите режимы доступа и совместного использования 
файла в функции CreateFile. 
5. Перечислите возможные параметры создания файла функцией 
CreateFile. 
6. Перечислите возможные атрибуты и флаги файла в функции 
CreateFile. 
7. Каковы особенности закрытия файла функцией CloseHandle? 
8. Перечислите основные параметры функции ReadFile. 
9. Каковы возвращаемое значение и результаты работы функции 
ReadFile? 
10. Перечислите основные параметры функции WriteFile. 
11. Каковы возвращаемое значение и результаты работы функции 
WriteFile? 
12. Какие в WinAPI есть дополнительные функции работы с файлами? 
13. Что собой представляют файлы, отображаемые на память? 
14. Для чего можно применять файлы, отображаемые на память? 

 

Т е м а  2 

ДИНАМИЧЕСКИЕ БИБЛИОТЕКИ (DLL)  
И ИХ ПРИМЕНЕНИЕ 

Цель работы: изучить особенности создания и применения динамических библиотек в операционных системах семейства Windows. 

Краткие теоретические сведения 

Создание динамических библиотек 
В 32-разрядных DLL-библиотеках операционной системы Microsoft 
Windows используется функция DLLEntryPoint, которая выполняет все 
необходимые задачи по инициализации библиотеки и при необходимости 
освобождает заказанные ранее ресурсы. Функция DLLEntryPoint вызывается всякий раз, когда выполняется инициализация процесса или потока, обращающихся к функциям библиотеки, а также при явной загрузке 
и выгрузке библиотеки функциями LoadLibrary и FreeLibrary. 
Ниже приведен прототип функции DLLEntryPoint: 
 
BOOL WINAPI DllEntryPoint( 
HINSTANCE hinstDLL,  
// идентификатор модуля DLL- 
 библиотеки 
DWORD    fdwReason,   
// код причины вызова функции 
LPVOID   lpvReserved); // зарезервировано 
 
Через параметр hinstDLL функции DLLEntryPoint передается 
идентификатор модуля DLL-библиотеки, который можно использовать 
при обращении к ресурсам, расположенным в файле этой библиотеки. 

Что же касается параметра fdwReason, то он зависит от причины, 
по которой произошел вызов функции DLLEntryPoint. Этот параметр 
может принимать следующие значения: 
DLL_PROCESS_ATTACH: библиотека отображается в адресное пространство процесса в результате запуска процесса или вызова функции 
LoadLibrary; 
DLL_THREAD_ATTACH: текущий процесс создал новый поток, после 
чего система вызывает функции DLLEntryPoint всех DLL-библиотек, 
подключенных к процессу; 
DLL_THREAD_DETACH: этот код причины передается функции 
DLLEntryPoint, когда поток завершает свою работу нормальным (не 
аварийным) способом; 
DLL_PROCESS_DETACH: отображение DLL-библиотеки в адресное 
пространство отменяется в результате нормального завершения процесса или вызова функции FreeLibrary. 
Параметр lpvReserved зарезервирован. 
Обработка причины вызова и выполнение необходимых действий 
могут быть реализованы оператором switch: 
 
switch(fdwReason) 
{ 
// Подключение нового процесса 
case DLL_PROCESS_ATTACH: 
{ 
. . . // Обработка подключения процесса 
break; 
} 
. . . 
} 
 
В любом случае (даже если обработка подключений не производится) функция DLLEntryPoint должна вернуть результат: return 
TRUE; 

Экспортирование функций и глобальных переменных 
Кроме функции DLLEntryPoint в 32-разрядных библиотеках операционных систем Microsoft Windows могут быть определены экспортируемые и неэкспортируемые функции. Экспортируемые функции 
доступны для вызова приложениям Windows. Неэкспортируемые являются локальными для DLL-библиотеки, они доступны только для