MyBooks.club
Все категории

Джонсон Харт - Системное программирование в среде Windows

На сайте mybooks.club вы можете бесплатно читать книги онлайн без регистрации, включая Джонсон Харт - Системное программирование в среде Windows. Жанр: Программирование издательство -,. Доступна полная версия книги с кратким содержанием для предварительного ознакомления, аннотацией (предисловием), рецензиями от других читателей и их экспертным мнением.
Кроме того, на сайте mybooks.club вы найдете множество новинок, которые стоит прочитать.

Название:
Системное программирование в среде Windows
Издательство:
-
ISBN:
-
Год:
-
Дата добавления:
17 сентябрь 2019
Количество просмотров:
264
Читать онлайн
Джонсон Харт - Системное программирование в среде Windows

Джонсон Харт - Системное программирование в среде Windows краткое содержание

Джонсон Харт - Системное программирование в среде Windows - описание и краткое содержание, автор Джонсон Харт, читайте бесплатно онлайн на сайте электронной библиотеки mybooks.club
Эта книга посвящена вопросам разработки приложений с использованием интерфейса прикладного программирования операционных систем компании Microsoft (Windows 9х, Windows XP, Windows 2000 и Windows Server 2003). Основное внимание уделяется базовым системным службам, включая управление файловой системой, процессами и потоками, взаимодействие между процессами, сетевое программирование и синхронизацию. Рассматривается методика переноса приложений, написанных в среде Win32, в среду Win64. Подробно описываются все аспекты системы безопасности Windows и ее практического применения. Изобилие реальных примеров, доступных также и на Web-сайте книги, существенно упрощает усвоение материала.Книга ориентирована на разработчиков и программистов, как высокой квалификации, так и начинающих, а также будет полезна для студентов соответствующих специальностей.

Системное программирование в среде Windows читать онлайн бесплатно

Системное программирование в среде Windows - читать книгу онлайн бесплатно, автор Джонсон Харт

/* Глава 4. Команда toupper. */

/* Преобразование содержимое одного и более файлов с заменой всех букв на прописные. Имя выходного файла получается из имени входного файла добавлением к нему префикса UC_. */

#include "EvryThng.h"


int _tmain(DWORD argc, LPTSTR argv[]) {

 HANDLE hIn = INVALID_HANDLE_VALUE, hOut = INVALID_HANDLE_VALUE;

 DWORD FileSize, nXfer, iFile, j;

 CHAR OutFileName [256] = "", *pBuffer = NULL;

 OVERLAPPED ov = {0, 0, 0, 0, NULL}; /* Используется для блокирования файлов. */

 if (argc <= 1) ReportError(_T("Использование: toupper файлы"), 1, FALSE);

 /* Обработать все файлы, указанные в командной строке. */

 for (iFile = 1; iFile < argc; iFile++) __try { /* Блок исключений. */

  /* Все дескрипторы файлов недействительны, pBuffer == NULL, а файл OutFileName пуст. Выполнение этих условий обеспечивается обработчиками. */

  _stprintf(OutFileName, "UC_%s", argv[iFile]);

  __try { /* Внутренний блок try-finally. */

   /* Ошибка на любом шаге сгенерирует исключение, и следующий */

   /* файл будет обрабатываться только после "уборки мусора". */

   /* Объем работы по очистке зависит от того, в каком месте */

   /* программы возникла ошибка. */

   /* Создать выходной файл (завершается с ошибкой, если файл уже существует). */

   hIn = CreateFile(argv[iFile], GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);

   if (hIn == INVALID_HANDLE_VALUE) ReportException(argv[iFile], 1);

   FileSize = GetFileSize(hIn, NULL);

   hOut = CreateFile(OutFileName, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_NEW, 0, NULL);

   if (hOut == INVALID_HANDLE_VALUE) ReportException(OutFileName, 1);

   /* Распределить память под содержимое файла. */

   pBuffer = malloc(FileSize);

   if (pBuffer == NULL) ReportException(_T("Ошибка при распределении памяти"), 1);

   /* Блокировать оба файла для обеспечения целостности копии. */

   if (!LockFileEx(hIn, LOCKFILE_FAIL_IMMEDIATELY, 0, FileSize, 0, &ov) ReportException(_T("Ошибка при блокировании входного файла"), 1);

   if (!LockFileEx(hOut, LOCKFILE_EXCLUSIVE_LOCK | LOCKFILE_FAIL_IMMEDIATELY, 0, FileSize, 0, &ov) ReportException(_T("Ошибка при блокировании выходного файла "), 1);

   /* Считать данные, преобразовать их и записать в выходной файл. */

   /* Освободить ресурсы при завершении обработки или возникновении */

   /* ошибки; обработать следующий файл. */

   if (!ReadFile(hIn, pBuffer, FileSize, &nXfer, NULL)) ReportException(_T("Ошибка при чтении файла"), 1);

   for (j = 0; j < FileSize; j++) /* Преобразовать данные. */

    if (isalpha(pBuffer [j])) pBuffer[j] = toupper(pBuffer [j]);

   if(WriteFile(hOut, pBuffer, FileSize, &nXfer, NULL)) ReportException(T("Ошибка при записи в файл"), 1);

  } __finally {

   /*Освобождение блокировок, закрытие дескрипторов файлов,*/

   /*освобождение памяти и повторная инициализация */

   /*дескрипторов и указателя. */

   if (pBuffer != NULL) free (pBuffer);

   pBuffer = NULL;

   if (hIn != INVALID_HANDLE_VALUE) {

    UnlockFileEx(hIn, 0, FileSize, 0, &ov);

    CloseHandle(hIn);

    hIn = INVALID_HANDLE_VALUE;

   }

   if (hOut != INVALID_HANDLE_VALUE) {

    UnlockFileEx(hOut, 0, FileSize, 0, &ov);

    CloseHandle(hOut);

    hOut = INVALID_HANDLE_VALUE;

   }

   _tcscpy(OutFileName, _T(""));

  }

 }

 /* Конец основного цикла обработки файлов и блока try. */

 /* Обработчик исключений для тела цикла. */

 __except(EXCEPTION_EXECUTE_HANDLER) {

  _tprintf(_T("Ошибка при обработке файла %sn"), argv[iFile]);

  DeleteFile (OutFileName);

 }

 _tprintf(_T("Обработаны все файлы, кроме указанных выше n"));

 return 0;

}

Пример: использование функции фильтра

Программа 4.3 представляет собой каркас программы, иллюстрирующей обработку исключений и завершения выполнения, в которой используется функция фильтра. Программа предлагает пользователю указать тип исключения, после чего продолжает работу для генерации исключения. Функция фильтра обрабатывает различные типы исключений по-разному; выбор вариантов, предусмотренных в программе, был совершенно произвольным и определялся исключительно целями демонстрации. В частности, программа обнаруживает попытки обращения к недоступным областям памяти, предоставляя адреса виртуальной памяти, по которым производилось такое обращение.

Блок __finally восстанавливает состояние маски FP-исключений. Совершенно очевидно, что восстановление состояния маски в данном случае, когда процесс уже должен завершаться, особого значения не имеет, но эта методика пригодится нам впоследствии, когда мы будем использовать ее на стадии завершения выполнения потока. Вообще говоря, процесс должен восстанавливать и системные ресурсы, например, удалять временные файлы, освобождать ресурсы синхронизации (глава 8) и отменять блокирование файлов (главы 3 и 6). Функция фильтра представлена в программе 4.4.

Данный пример не иллюстрирует обработку исключений, которые могут возникать при распределении памяти; эти исключения мы начнем интенсивно использовать в главе 5.

Программа 4.3. Exception: обработка исключений и завершения выполнения

#include "EvryThng.h"

#include <float.h>


DWORD Filter(LPEXCEPTION_POINTERS, LPDWORD);

double x = 1.0, у = 0.0;


int _tmain(int argc, LPTSTR argv[]) {

 DWORD ECatgry, i = 0, ix, iy = 0;

 LPDWORD pNull = NULL;

 BOOL Done = FALSE;

 DWORD FPOld, FPNew;

 FPOld = _controlfp(0, 0); /* Сохранить старую управляющую маску. */

 /* Разрешить FP-исключения. */

 FPNew = FPOld & ~(EM_OVERFLOW | EM_UNDERFLOW | EM_INEXACT | EM_ZERODIVIDE | EM_DENORMAL | EM_INVALID);

 _controlfp(FPNew, MCW_EM);

 while (!Done) _try { /* Блок try-finally. */

  _tprintf(_T("Введите тип исключения: "));

  _tprintf(_T(" 1: Mem, 2: Int, 3: Flt 4: User 5: __leave "));

  _tscanf(_T("%d"), &i);

  __try { /* Блок try-except. */

   switch (i) {

   case 1: /* Исключение при обращении к памяти. */

    ix = *pNull;

    *pNull = 5;

    break;

   case 2: /* Исключение при выполнении арифметических операций над целыми числами. */

    ix = ix / iy;

    break;

   case 3: /* FP-исключение. */

    x = x / у;

    _tprintf(_T("x = %20en"), x);

    break;

   case 4: /* Пользовательское исключение. */

    ReportException(_T("Пользовательское исключение"), 1);

    break;

   case 5: /* Использовать оператор _leave для завершения выполнения.*/

    __leave;

   default:

    Done = TRUE;

   }

  } /* Конец внутреннего блока __try. */

  __except(Filter(GetExceptionInformation(), &ECatgry)) {

   switch(ECatgry) {

   case 0:

    _tprintf(_T("Неизвестное исключениеn"));

    break;

   case 1:

    _tprintf(_T("Исключение при обращении к памятиn"));

    continue;

   case 2:

    _tprintf(_T("Исключение при выполнении арифметических операций над целыми числами n"));

    break;

   case 3:

    _tprintf(_Т("FР-исключениеn"));

    _clearfp();

    break;

   case 10:

    _tprintf(_T("Пользовательское исключениеn"));

    break;

   default:

    _tprintf(_T("Неизвестное исключениеn"));

    break;

   } /* Конец оператора switch. */

   _tprintf(_Т("Конец обработчикаn"));

  }

  /* Конец блока try-except. */

 } /* Конец цикла while – ниже находится обработчик завершения. */

 __finally { /* Это часть цикла while. */

  _tprintf(_T("Аварийное завершение?: %dn"),

  AbnormalTermination());

 }

 _controlfp(FPOld, 0xFFFFFFFF); /* Восстановить старую FP-маску.*/

 return 0;

}

Программа 4.4 представляет функцию фильтра, используемую в программе 4.3. Эта функция просто проверяет и классифицирует различные возможные значения кодов исключений. В программном коде, размещенном на Web-сайте книги, проверяется каждое из возможных значений, в то время как приведенная ниже функция осуществляет проверку лишь тех из них, которые нужны для тестовой программы.

Программа 4.4. Функция Filter

static DWORD Filter(LPEXCEPTION_POINTERS pExP, LPDWORD ECatgry)

/* Классификация исключений и выбор соответствующего действия. */

{

 DWORD ExCode, ReadWrite, VirtAddr;

 ExCode = pExP->ExceptionRecord->ExceptionCode;

 _tprintf(_T("Filter. ExCode:. %xn"), ExCode);

 if ((0x20000000 & ExCode) != 0) { /* Пользовательское исключение. */

  *ECatgry =10;

  return EXCEPTION_EXECUTE_HANDLER;

 }

 switch (ExCode) {

 case EXCEPTION_ACCESS_VIOLATION:

  ReadWrite = /* Операция чтения или записи? */

   pExP->ExceptionRecord->ExceptionInformation[0];

  VirtAddr = /* Адрес сбоя в виртуальный памяти. */


Джонсон Харт читать все книги автора по порядку

Джонсон Харт - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки mybooks.club.


Системное программирование в среде Windows отзывы

Отзывы читателей о книге Системное программирование в среде Windows, автор: Джонсон Харт. Читайте комментарии и мнения людей о произведении.

Прокомментировать
Подтвердите что вы не робот:*
Подтвердите что вы не робот:*
Все материалы на сайте размещаются его пользователями.
Администратор сайта не несёт ответственности за действия пользователей сайта..
Вы можете направить вашу жалобу на почту librarybook.ru@gmail.com или заполнить форму обратной связи.