• Структура каталогов
  • Учебные пособия (слайды)
  • Каталог Utility
  • Каталог Include
  • Распределение программ по главам
  • Листинги включаемых файлов
  • Дополнительные служебные программы
  • ПРИЛОЖЕНИЕ А

    Использование примеров программ

    На Web-сайте книги (http://www.awprofessional.com/titles/0321256190) находится zip-архив, который содержит исходные тексты всех примеров программ, а также соответствующие заголовочные файлы, служебные функции, файлы проектов и исполняемые файлы. Ряд программ демонстрируют дополнительные возможности и предоставляют решения отдельных упражнений, однако на Web-сайте приведены решения не для всех упражнений и представлены не все из упоминающихся в книге альтернативных вариантов реализации программ.

    • Все программы тестировались под управлением Windows 2000, XP и Server 2003 на самых различных системах, от лэптопов до серверов. В необходимых случаях тестирование осуществлялось под управлением Windows 9x, хотя многие программы — особенно те, которые предлагаются на более поздних этапах изложения материала — под управлением Windows 9x и даже NT 4.0 выполняться не будут.

    • Сборка и выполнение программ осуществлялись как с включенными определениями UNICODE, так и без таковых. Под управлением Windows 9x будут работать лишь те программы, в которых возможность работы с символами в кодировке UNICODE не предусмотрена.

    • В подавляющем большинстве случаев компиляция программ в интегрированной среде разработки Microsoft Visual C++ версий 7.0 и 6.0 не будет сопровождаться выдачей предупреждающих сообщений, если для критерия серьезности ошибок (warning level), которые должны сопровождаться выводом диагностических сообщений компилятора, установлено значение 3. Однако существуют некоторые незначительные исключения, например, вывод сообщения "Отсутствует оператор return в основной программе" ("no return from main program") в случае использования функции ExitProcess.

    • Для проектов Microsoft Visual Studio .NET и Microsoft Visual Studio C++ 6.0 предусмотрены разные каталоги, каковыми являются каталоги Projects7 и Projects6. Соответствующие исполняемые файлы программ помещаются в каталоги run7 и run6.

    • В программах широко применяются функции обобщенной библиотеки С, а также такие специфические для используемых типов компиляторов ключевые слова, как __try, __except или __leave. Начиная с главы 7, важную роль в программах играют многопоточная библиотека С времени выполнения и функции _beginthreadex и _endthreadex.

    • Предоставляются как файлы проектов (в их окончательной (release), а не отладочной (debug) форме), так и make-файлы. Все проекты достаточно просты, характеризуются минимальным количеством зависимостей (dependencies) и их можно быстро создать заново в любой желаемой конфигурации с получением либо отладочной, либо окончательной версии.

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

    Для сборки программ можно воспользоваться также такими инструментальными средствами, распространяемыми в рамках проекта программного обеспечения с открытым исходным кодом (GNU), как компиляторы gcc и g++, входящие в состав комплекта инструментов Gnu Compiler Collection (http://gcc.gnu.org/). Читатели, заинтересованные в подобных средствах разработки, должны ознакомиться с действующим на условиях GNU проектом MinGW (http://www.mingw.org), который описывается как "совокупность свободно доступных и свободно распространяемых заголовочных файлов и библиотек импорта, специфических для Windows, объединенных с наборами инструментов GNU, что позволяет создавать программы для среды Windows, не зависящие от динамических библиотек С времени выполнения, выпускаемых третьими сторонами". В то же время, при тестировании большинства примеров программ, приведенных в книге, я эти средства не применял, но весьма успешно использовал возможности MinGW, и мне даже удавалось выполнять межплатформенную сборку для создания исполняемых программ и DLL-библиотек Windows в Linux-системах. Более того, я имел возможность убедиться в чрезвычайно высокой эффективности систем диагностики ошибок и вывода предупреждающих сообщений компиляторов gcc и g++ при разработке 64-разрядных программ.

    Структура каталогов

    Основной каталог носит название WindowsSmpEd3 (от Windows Sample Programs, Edition 3). Для каждой главы предусмотрен отдельный подкаталог. Все заголовочные файлы находятся в каталоге Include, а в каталоге Utilities содержатся такие часто используемые функции, как ReportError или PrintStrings. Готовые проекты помещены в каталоги Projects6 и Projects7 (для Visual C++ 6.0 и 7.0 соответственно). Исполняемые программы и библиотеки DLL для всех проектов хранятся в каталогах run6 и run7. В каталоге TimeTest содержатся файлы, которые требуются для тестирования производительности программ, описанного в приложении В. Прежде чем мы приступим к описанию содержимого отдельных подкаталогов WindowsSmpEd3, необходимо вкратце рассмотреть остальное содержимое Web-сайта.

    Учебные пособия (слайды)

    В каталоге Overheads содержатся слайды Power Point. Слайды включены для удобства преподавателей колледжей и университетов, которые захотят воспользоваться материалом книги в курсах своих лекций. Слайды не предназначены для коммерческого использования.

    Каталог Utility

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

    1. Файл ReprtErr.с содержит функции ReportError (программа 2.2) и ReportException (программа 4.1). За исключением программ grep и wc, а также программ, приведенных в главе 1, каждая из программ, запускаемых на выполнение как процесс программами из примеров, нуждается в этом файле.

    2. Файл PrintMsg.c содержит функции PrintStrings, PrintMsg и ConsolePrint (программа 2.1). Так как эти функции вызываются функцией ReprtErr.с, то этот исходный файл также требуется почти во всех проектах.

    3. Файл Options.с содержит функцию, которая обрабатывает параметры командной строки и часто используется, начиная с главы 2. Включайте этот исходный файл в проект любой программы, в которой используются параметры командной строки. Соответствующий листинг приведен в программе А.7.

    4. Файл Wstrings.с содержит исходный код функции wmemchr, используемой в файле Options.с. Включайте этот файл в проекты в соответствии с необходимостью. Также не исключено, что вы захотите добавить и другие функции, предназначенные для работы с обобщенными строками.

    5. Файл SkipArg.с обеспечивает обработку командной строки путем пропуска одного поля аргумента при каждом вызове. Его листинг приведен в программе А.8.

    6. Файл GetArgs.с содержит функцию, которая преобразует строку символов к виду argc, argv[]. Эта функция полезна при разбиении командной строки на отдельные аргументы, как это делается, например, в случае командной строки, получаемой из функции GetCommandLine, введенной в главе 6. Листинг этого файла приведен в программе А.8.

    7. Файл Version.с реализует функцию DllGetVersion для библиотеки DLL, построенной из этих модулей.

    Перечисленные функции можно компилировать и компоновать вместе с вызывающими программами. Однако проще скомпоновать их отдельно в виде библиотеки, статической или динамической. В проекте Utility_3_0 эти файлы с исходными кодами используются для создания библиотеки DLL, а в проекте utulityStatic — для создания статической библиотеки.

    Каталог Include

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

    1. EvryThng.h, как говорит само его название, включает почти все определения, которые требуются для обычных программ, как однопоточных, так и многопоточных. В частности, он включает файлы Envirmnt.h и Support.h. Соответствующий листинг приведен в программе А.1.

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

    3.  Envirmnt.h содержит согласованные определения переменных препроцессора UNICODE и _UNICODE, а также определения языка и подъязыка, используемые функцией ReportError. Листинг этого файла приведен в программе A.3.

    4. Support.h содержит определения многих общих функций, например, ReportError, а также ряд часто используемых символических констант. Соответствующий листинг представлен в программе A.3.

    5. ClntSrvr.h используется начиная с главы 11. В нем содержатся определения структур сообщений, используемых для запросов и ответов, а также определения именованных каналов сервера и клиента, почтовых ящиков, длительностей интервалов ожидания и т.п. См. программу А.5.

    6. JobMgt.h используется в программах управления задачами в конце главы 6. См. программу А.5.

    Распределение программ по главам

    В каталоге каждой главы содержатся все программы, относящиеся к данной главе (за исключением тех, которые были помещены в каталог Utility), а также всевозможные дополнительные программы. Соответствующий их перечень, сопровождаемый кратким описанием служебных программ, представлен ниже. В названиях некоторых программ присутствует суффикс "x"; в эти программы намеренно внесены дефекты, чтобы проиллюстрировать распространенные ошибки программирования.

    Примечание

    Имена многих программ, например, программ tail и touch, которые рассматривались в главе 7, совпадают с названиями утилит UNIX, работу которых они имитируют. Во избежание путаницы вы можете дать этим программам другие имена. Некоторые программы уже переименованы таким образом; в качестве примера можно указать программы lsW и cpW. 

    Глава 1

    • срС.с — программа 1.1.

    •  cpW.c — программа 1.2; cpwFA.c — ее модифицированный вариант, обеспечивающий лучшую производительность. См. результаты в приложении В.

    • cpCF.с — программа 1.3.

    • К числу других программ относятся UNIX-версия этой программы (cpU.с), а также программа (cpUC.c), скомпонованная с использованием библиотеки совместимости UNIX, предоставляемой Visual C++. CpwFA.с — вариант Cpw.c, обеспечивающий повышенное быстродействие за счет использования буферов большого размера, флагов последовательного просмотра и других методик, введенных в главе 2.

    Глава 2

    • Программы 2.1 и 2.2 находятся в упомянутом ранее каталоге Utility.

    • cat.с — программа 2.3.

    • atou.с — программа 2.4.

    • Asc2Un.c — программа 2.5; Asc2UnFA.c и Asc2UnNB.c — ее версии, обеспечивающие лучшую производительность. Все три файла реализуют функцию Asc2Un, которая вызывается программой 2.5.

    • pwd.c — программа 2.6; pwda.c — модифицированный вариант, обеспечивающий выделение необходимого объема памяти для размещения пути доступа.

    • cd.c — реализация команды UNIX, осуществляющей переход к другому каталогу; эта программа не совпадает с той, которая используется в главе 2.

    Глава 3

    • RandomAccess.с — программа 3.1.

    • lsW.c — программа 3.2. rmW.c — аналогичная программа, предназначенная для удаления файлов.

    • touch.с — программа 3.3.

    • getn.c — дополнительная программа для чтения записей фиксированной длины, иллюстрирующая доступ к файлам и вычисление позиции в файле.

    • lsReg.с — программа 3.4.

    • FileSize.с — приведенное в учебных целях решение, позволяющее определить, является ли выделенное для файла пространство разреженным.

    • TestLock.с — осуществляет блокирование файла.

    • tail.с — требуется как часть упражнения 3.3. 

    Глава 4

    • Программа 4.1 включена в файл ReprtErr.c, находящийся в каталоге Utulity.

    • toupper.c — программа 4.2. toupperX.c содержит преднамеренно внесенные ошибки; их устранение послужит для вас хорошим упражнением.

    • Exception.с — программа 4.3, а также функция фильтра — программа 4.4.

    • Ctrlc.с — программа 4.5.

    Глава 5

    • sortBT.c — представляет программы 5.1 и 5.2; sortBTSR.c — вариант, в котором отсутствует опция отказа от сериализации при вызове функций управления памятью, что используется для выяснения влияния этого фактора на производительность в случае простых приложений. Читатель может самостоятельно убедиться в том, что наблюдаемый эффект является весьма незначительным.

    • Asc2UnMM.с — функция для программы 5.3.

    • sortFL.с — программа 5.4, a sortHP.с — аналогичная программа, за исключением того, что вместо отображения файлов используется их считывание в буфер, выделяемый в памяти.

    • sortMM.с — программы 5.5 и 5.6.

    • atouEL.c — программа 5.7, a Asc2UnDll.c и Asc2UnmmDLL.c — исходные файлы для требуемых библиотек DLL. Asc2Unmmfl.c — еще один вариант, очищающий память при завершении выполнения, что может приводить к общему замедлению программы, но оставляет систему в безопасном состоянии.

    • HeapNoSr.c — тестовая программа для количественной оценки эффекта использования флага HEAP_NO_SERIALIZE при распределении памяти. Эту программу можно использовать при выполнении упражнения 5.1.

    • RandFile.c — генерирует текстовые файлы заданного размера со случайными ключами; такие файлы удобны для тестирования функций сортировки и используются для генерирования текстовых файлов большого размера во многих тестах с целью определения временных характеристик выполнения программ.

    • clear.с — простая программа, выделяющая и инициализирующая память крупными блоками до наступления сбоя. Эта программа используется в перерывах между тестами синхронизации для гарантии того, что данные не кэшируются в памяти, ибо это могло бы искажать результаты тестов. 

    Глава 6

    • grepMP.c — программа 6.1. grep.с — исходный файл программы поиска заданных символьных шаблонов, которая вызывается как процесс программой grepMP.c.

    • timep.с — программа 6.2.

    • JobShell.c — программа 6.3, a JobMgt.c предоставляет функции поддержки программ 6.4, 6.5 и 6.6.

    • catHA.c и grepMPha.c — модифицированные версии других программ, предназначенных для демонстрации передачи дескриптора в командной строке, что используется при решении упражнения 6.2.

    • version.с — получает сведения об операционной системе, включая номер ее версии.

    Глава 7

    • grepMT.c — программа 7.1. grepMTx.c — ее вариант с преднамеренно введенными дефектами; устранение этих дефектов предлагается в упражнении 7.7.

    • sortMT.c — программа 7.2. sortMTx.c — ее вариант с преднамеренно введенными дефектами.

    • wcMT.с — решение упражнения 7.6. Имеются также две версии с преднамеренно введенными дефектами и еще одна версия, сериализующая обработку файла, которая предусмотрена для анализа временных характеристик выполнения программ.

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

    Глава 8

    • simplePC.с — программа 8.1.

    • eventPC.с — программа 8.2.

    Глава 9

    • statsMX.c — программа 9.1. Ее различными вариантами являются statsNS.c, statsCS.cn statsIN.c.

    • TimedMutualExclusion.c — используется для исследования временных характеристик, предлагаемого в тексте главы и упражнениях. 

    Глава 10

    • В программе 10.1 содержится часть файла SynchObj.h, находящегося в каталоге Include. Остальная часть указанного файла содержится в программе 10.3.

    • ThbObject.c — программа 10.2. testTHB — соответствующая тестовая программа.

    • QueueObj.с — программа 10.4, различными вариантами которой являются программы QueueObjCS.c (используется объект CRITICAL_SECTION), QueueObjSOAW.c (используется функция SignalObjectAndWait) и версия, использующая сигнальную модель.

    • ThreeStage.c — программа 10.5, для проекта которой требуются файлы Messages.с и QueueObj.c.

    • QueueObjCancel.с — программа 10.6, которая работает в сочетании с программой ThreeStageCancel.c.

    • MultiSem.c — вместе с тестовой программой TestMultiSem.c образует решение упражнения 10.11.

    • MultiPCav.c — использует Pthreads; будет очень неплохо, если в качестве упражнения вы попытаетесь преобразовать эту программу к форме, использующей Windows API или библиотеку Pthreads с открытым исходным кодом.

    Глава 11

    • pipe.с — программа 11.1. Для демонстрации работы этой программы удобно использовать команду wc.с. pipeNP.с — вариант, использующий именованный канал.

    • clientNP.с — программа 11.2.

    • serverNP.с — программа 11.3.

    • SrvrBcst.c — программа 11.4.

    • LocSrver.с — программа 11.5.

    Глава 12

    • clientSK.с — программа 12.1.

    • serverSK.c — программа 12.2.

    • command. с — программа 12.3.

    • SendReceiveSKST.c — программа 12.4, a serverSKST.c и clientSKST.c — соответствующие варианты программ serverSK.c и clientSK.с, незначительно модифицированных для обеспечения потокового ввода/вывода. Программу SendReceiveSKST.c следует компоновать как библиотеку DLL, которая должна неявно связываться с проектами сервера и клиента.

    • SendReceiveSKHA.c — программа 12.5, a serverSKHA.c — соответствующий сервер, который использует DLL. Программа clientSKST.c будет работать с этим сервером.

    Глава 13

    • SimpleService.c — программа 13.2; дополнительно включает все, что требуется для программы 13.1.

    • ServiceShell.с — программа 13.3.

    • ServiceSK.с — это программа serverSK (программа 12.2), преобразованная в службу.

    Глава 14

    • atouOV. с — программа 14.1.

    • atouEX.c — программа 14.2, выполняющая ту же задачу с использованием расширенного ввода/вывода.

    • atouMT.с — выполняет ту же задачу с использованием многопоточного режима вместо асинхронного ввода/вывода Win32. atouMT_dh.с — неправильная версия, включенная для иллюстрации одной интересной, хотя и сопряженной с определенными рисками возможности дублирования дескрипторов.

    • atouMTCP.с — использует порты завершения ввода/вывода.

    • TimeBeep.с — программа 14.3.

    • serverCP.c — программа 14.4, представляющая собой версию программы serverMT, в которой используются порты завершения ввода/вывода и перекрывающийся ввод/вывод.

    Глава 15

    • chmodW.с — программа 15.1, в которую добавлены возможности различения элементов АСЕ, предоставляющих и отменяющих разрешения доступа (как описано в тексте). chmodBSD.c — видоизмененный вариант программы, в котором используется функция BuildSecurityDescriptor.

    • lsFP.с — программа 15.2.

    • InitUnFp.c — код для программ 15.3, 15.4 и 15.5. Эти функции нужны программам 15.1 и 15.2. Кроме того, в исходном модуле содержится код, показывающий, как получить имя группы-владельца, что вам предлагается самостоятельно сделать в упражнении 15.12. 

    • TestFp.c — дополнительная тестовая программа, которая оказалась полезной в процессе тестирования.

    • serverNP_secure.с — программа 15.6.

    • JobShell_secure.c и JobMgt_secure.с — усовершенствованные варианты программ для системы управления заданиями, которая рассматривается в главе 6.

    Глава 16

    Для этой главы предусмотрен только один файл с исходным кодом, а именно, sortMM64.c, который представляет собой программу sortMM.c из главы 5, усовершенствованную таким образом, чтобы она могла выполняться на обеих платформах Win32 и Win64.

    Листинги включаемых файлов

    EvryThng.h Программа А.1. Заголовочный файл EvryThng.h 

    /* EvryThng.h – Включает все стандартные и пользовательские */

    /* заголовочные файлы. */

    #include "Exclude.h" /* Исключает описания, которые не требуются для примеров программ.*/

    #include "envirmnt.h"

    #include <windows.h>

    #include <tchar.h>

    #include <stdio.h>

    #include <io.h>

    #include "support.h"

    #ifdef _MT

    #include <process.h>

    /* DWORD_PTR (целое без знака, соответствующее точности указателя)

     * используется для целых чисел, преобразуемых в дескрипторы или указатели.

     * Благодаря этому в Win64 не будут выводиться предупреждающие сообщения,

     * касающиеся взаимных преобразований 32-битовых и 64-битовых данных,

     * поскольку в Win64 дескрипторы HANDLE и указатели являются 64-битовыми

     * (см. главу 16). Этот режим активизируется только в том случае,

     * если определена символическая константа _Wp64.

     */

    #if !defined(_Wp64)

    #define DWORD_PTR DWORD

    #define LONG_PTR LONG

    #define INT_PTR INT

    #endif 

    Envirmnt.h Программа А.2. Включаемый файл Envirmnt.h 

    /* Envirmnt.h — Здесь определяются константы UNICODE и _МТ. */

    /* Лучше и проще определить константу UNICODE в проекте. */

    /* Используйте команды меню: Project…Settings…C/C++. Затем, перейдя */

    /* в окно Project Options, добавьте в нижней части: /D "UNICODE". */

    /* Проделайте то же самое для констант _МТ и _STATIC_LIB. */


    //#define UNICODE

    #undef UNICODE

    #ifdef UNICODE

    #define _UNICODE

    #endif

    #ifndef UNICODE

    #undef _UNICODE

    #endif

    //#define _STATICLIB

    /* Определите _STATICLIB, если создаете */

    /* или компонуете статическую библиотеку. */

    #define LANG_DFLT LANG_ENGLISH

    #define SUBLANG_DFLT SUBLANG_ENGLISH_US

    Support.h Программа А.З. Включаемый файл Support.h 

    /* Support.h */

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

    /* НЕСМОТРЯ НА ВКЛЮЧЕНИЕ ОПИСАНИЙ КОНСТАНТ UTILITY_EXPORTS И _STATICLIB, ИХ ЛУЧШЕ ОПРЕДЕЛЯТЬ НЕ ЗДЕСЬ, А В ПРОЕКТЕ. */

    /* Имя "UTILITY_EXPORTS" генерируется средой разработки Visual Studio, если вы создаете проект DLL с именем "Utility", но его также можно определить в командной строке С. */

    // UTILITY_3_0_EXPORTS определяется в проекте UTILITY_3_0.

    #if defined(UTILITY_3_0_EXPORTS)

    #define LIBSPEC _declspec(dllexport)

    #elif defined(__cplusplus)

    #define LIBSPEC extern "C" _declspec(dllimport)

    #else

    #define LIBSPEC _declspec(dllimport)

    #endif


    #define EMPTY _T("")

    #define YES _T("y")

    #define NO _T("n")

    #define CR 0x0D 

    #define LF 0x0A

    #define TSIZE sizeof(TCHAR)


    /* Предельные значения и константы. */

    #define TYPE_FILE 1 /* Используется в ls, rm, и lsFP. */

    #define TYPE_DIR 2

    #define TYPE_DOT 3

    #define MAX_OPTIONS 20 /* Максимальное количество параметров командной строки.*/

    #define MAX_ARG 1000 /* Максимальное количество аргументов командной строки.*/

    #define MAX_COMMAND_LINE MAX_PATH+50 /*Максимальный размер командной строки*/


    /* Часто используемые функции. */

    LIBSPEC BOOL ConsolePrompt(LPCTSTR, LPTSTR, DWORD, BOOL);

    LIBSPEC BOOL PrintStrings(HANDLE, ...);

    LIBSPEC BOOL PrintMsg(HANDLE, LPCTSTR);

    LIBSPEC VOID ReportError(LPCTSTR, DWORD, BOOL);

    LIBSPEC VOID ReportException(LPCTSTR, DWORD);

    LIBSPEC DWORD Options(int, LPCTSTR *, LPCTSTR, ...);

    LIBSPEC LPTSTR SkipArg(LPCTSTR);

    LIBSPEC VOID GetArgs(LPCTSTR, int *, LPTSTR *);


    /* Набор функций для работы с обобщенными строками в стиле string.h. Создавались по мере необходимости – первоначально была только одна функция! Реализация взята из [27]. */

    LIBSPEC LPCTSTR wmemchr(LPCTSTR, TCHAR, DWORD);


    #ifdef _UNICODE /* Это объявление уже должно было быть добавлено. */

    #define _tstrrchr wcsrchr

    #else

    #define _tstrrchr strrchr

    #endif


    #ifdef _UNICODE /* Это объявление уже должно было быть добавлено. */

    #define _memtchr wmemchr

    #else

    #define _memtchr memchr

    #endif


    /* Функции безопасности. */

    LPSECURITY_ATTRIBUTES InitializeUnixSA(DWORD, LPTSTR, LPTSTR, LPDWORD, LPHANDLE);

    LPSECURITY_ATTRIBUTES InitializeAccessOnlySA(DWORD, LPTSTR, LPTSTR, LPDWORD, LPHANDLE);

    DWORD ReadFilePermissions(LPTSTR, LPTSTR, LPTSTR);

    BOOL ChangeFilePermissions(DWORD, LPTSTR, LPDWORD, LPDWORD);

    /* В упрощенной форме доступны в Visual C++ Version 5.0. */

    //PSECURITY_DESCRIPTOR InitializeSD(DWORD, LPTSTR, LPTSTR, LPDWORD);


    /* Константы, которые требуются для функций безопасности. */

    #define LUSIZE 1024

    #define ACCT_NAME_SIZE LUSIZE
     

    JobMgt.h Программа А.4. Включаемый файл JobMgt.h 

    /* JobMgt.h — Определения, необходимые для управления задачами. Глава 6. */

    /* Код выхода для программы управления задачами в случае прекращения их выполнения. */


    #define JM_EXIT_CODE 0x1000


    typedef struct _JM_JOB {

     DWORD ProcessId;

     TCHAR CommandLine[MAX_PATH];

    } JM_JOB;

    #define SJM_JOB sizeof (JM_JOB)


    /* Функции управления задачами. */

    DWORD GetJobNumber(PROCESS_INFORMATION *, LPCTSTR);

    BOOL DisplayJobs(void);

    DWORD FindProcessId(DWORD);

    BOOL GetJobMgtFileName(LPTSTR);
     

    ClntSrvr.h Программа А.5. Включаемый файл ClntSrvr.h 

    /* Определения для программ, обеспечивающих клиент-серверное взаимодействие*/

    /* Сообщения запроса и ответа. Сообщения имеют кодировку ASCII, поскольку запрос может поступать от системы Windows 95. */

    #define MAX_RQRS_LEN 0x1000


    typedef struct {

     DWORD32 RqLen; /* Размер структуры запроса, исключая размер этого поля. */

     CHAR Command;

     BYTE Record[MAX_RQRS_LEN];

    } REQUEST;


    typedef struct {

     DWORD32 RsLen; /* Размер структуры ответа, исключая размер этого поля*/

     CHAR Status;

     BYTE Record[MAX_RQRS_LEN];

    } RESPONSE;


    #define RQ_SIZE sizeof(REQUEST)

    #define RQ_HEADER_LEN RQ_SIZE-MAX_RQRS_LEN

    #define RS_SIZE sizeof(RESPONSE)

    #define RS_HEADER_LEN RS_SIZE-MAX_RQRS_LEN


    /* Структура почтового сообщения. */

    typedef struct {

     DWORD msStatus; 

     DWORD msUtilization;

     TCHAR msName[MAX_PATH];

    } MS_MESSAGE;


    #define MSM_SIZE sizeof(MS_MESSAGE)

    #define CS_TIMEOUT 5000 /* Интервал ожидания для взаимодействия через именованный канал и мониторинга производительности. */

    #define MAXCLIENTS 10

    #define MAX_SERVER_TH 4 /* Максимальное количество серверных потоков для программы serverNPCP.*/

    #define MAX_CLIENTS_CP 16 /* Максимальное количество клиентов для программы serverNPCP.*/


    /* Имена серверных и клиентских каналов и почтовых ящиков. */

    #define SERVER_PIPE _Т("\\\\.\\PIPE\\SERVER")

    #define CLIENT_PIPE _T("\\\\.\\PIPE\\SERVER")

    #define SERVERBROADCAST _T("SrvrBcst.exe")

    #define MS_SRVNAME _T("\\\\.\\MAILSLOT\\CLS_MAILSLOT")

    #define MS_CLTNAME _T("\\\\.\\MAILSLOT\\CLS_MAILSLOT")

    #define MX_NAME _T("ClientServerMutex")

    #define SM_NAME _T("ClientServerSemaphore")


    /* Команды для функции поддержки статистики. */

    #define CS_INIT 1

    #define CS_RQSTART 2

    #define CS_RQCOMPLETE 3

    #define CS_REPORT 4

    #define CS_TERMTHD 5


    /* Функции поддержки клиент-серверной системы. */

    BOOL LocateServer(LPTSTR); 

    Exclude.h

    В программе А.6 определяются многочисленные переменные, позволяющие исключить определения, которые не требуются для примеров программ, приведенных в данной книге. Этот вопрос подробно обсуждается в [30].

    Программа А.6. Включаемый файл Exclude.h

    /* Exclude.h — Определения переменных для исключения ненужных заголовочных файлов. За дополнительными разъяснениями обратитесь в [30]. */

    #define WIN32_LEAN_AND_MEAN

    /* Весьма эффективная мера, уменьшающая размер предварительно скомпилированного заголовочного файла (pch) почти в два раза. */

    /* Эти определения также уменьшают размер pch-файла и уменьшают время компиляции. Все программы в данной книге будут компилироваться с этими определениями. От использования средств защиты можно отказаться при помощи оператора #define NOSECURITY. */ 

    #define NOATOM

    #define NOCLIPBOARD

    #define NOCOMM

    #define NOCTLMGR

    #define NOCOLOR

    #define NODEFERWINDOWPOS

    #define NODESKTOP

    #define NODRAWTEXT

    #define NOEXTAPI

    #define NOGDICAPMASKS

    #define NOHELP

    #define NOICONS

    #define NOTIME

    #define NOIMM

    #define NOKANJI

    #define NOKERNEL

    #define NOKEYSTATES

    #define NOMCX

    #define NOMEMMGR

    #define NOMENUS

    #define NOMETAFILE

    #define NOMSG

    #define NONCMESSAGES

    #define NOPROFILER

    #define NORASTEROPS

    #define NORESOURCE

    #define NOSCROLL

    #define NOSERVICE

    #define NOSHOWWINDOW

    #define NOSOUND

    #define NOSYSCOMMANDS

    #define NOSYSMETRICS

    #define NOSYSPARAMS

    #define NOTEXTMETRIC

    #define NOVIRTUALKEYCODES

    #define NOWH

    #define NOWINDOWSTATION

    #define NOWINMESSAGES

    #define NOWINOFFSETS

    #define NOWIMSTYLES

    #define OEMRESOURCE
     

    Дополнительные служебные программы

    Имеются три дополнительных программы, а именно, Options, SkipArg и GetArgs, которые достаточно полезны, чтобы привести здесь их листинги. В то же время, ни одна из этих программ не привязана жестко к Win32. 

    Options.с

    Эта функция просматривает командную строку в поиске слов, начинающихся с символа "-" (дефис), проверяет отдельные символы и устанавливает булевские параметры. Хотя эта функция и аналогична UNIX-функции getopt, она обладает меньшими возможностями.

    Программа А.7. Функция Options 

    /* Служебная функция для извлечения флагов опций из командной строки. */

    #include "EvryThng.h"

    #include <stdarg.h>


    DWORD Options(int argc, LPCTSTR argv[], LPCTSTR OptStr, ...)

    /* argv — командная строка. Параметры (опции), если они нужны, начинаются с символа '-' в argv[1], argv[2], ….

    OptStr — текстовая строка, содержащая все возможные параметры, находящиеся во взаимно-однозначном соответствии с адресами булевских переменных в списке аргументов (...). Эти флаги устанавливаются тогда и только тогда, когда символ соответствующей опции встречается в argv[1], argv[2], …Возвращаемым значением является индекс (в argv) первого аргумента, указанного вслед за опциями. */

    {

     va_list pFlagList;

     LPBOOL pFlag;

     int iFlag = 0, iArg;

     va_start(pFlagList, OptStr);

     while ((pFlag = va_arg(pFlagList, LPBOOL)) != NULL && iFlag < (int)_tcslen(OptStr)) {

      *pFlag = FALSE;

      for (iArg = 1; !(*pFlag) && iArg < argc && argv[iArg][0] == '-'; iArg++) *pFlag = _memtchr(argv[iArg], OptStr[iFlag], _tcslen(argv[iArg])) != NULL;

      iFlag++;

     }

     va_end(pFlagList);

     for (iArg = 1; iArg < argc && argv[iArg][0] == '-'; iArg++);

     return iArg;

    }
     

    SkipArg.с

    Эта функция обрабатывает командную строку, пропуская одно поле, отделенное пробельным символом. Впервые используется в программе timep (программа 6.2).

    Программа А.8. Функция SkipArg 

    /* SkipArg.с

       Пропуск одного аргумента командной строки – символы табуляции и пробела пропускаются. */

    #include "EvryThng.h"


    LPTSTR SkipArg(LPCTSTR targv) {

     LPTSTR p;

     p = (LPTSTR)targv;

     /* Перейти к следующему символу табуляции или пробела. */

     while (*р != '\0' && *р != TSPACE && *р != TAB) p++;

     /* Пропустить символы табуляции и пробела и перейти к следующему аргументу. */

     while (*р != '\0' && (*р == TSPACE || *р == TAB)) p++;

     return р;

    }
     

    GetArgs.с

    Эта функция просматривает строку, отыскивая слова, разделенные символами пробелов или табуляции, и помещает результат в массив строк, передаваемый функции. Эта функция может пригодиться для преобразования командной строки в массив argv[] и впервые используется в программе JobShell в главе 6. Функция Win32 CommandLineToArgW решает ту же задачу, но сфера ее применимости ограничивается символами Unicode.

    Программа А.9. Функция GetArgs 

    /* GetArgs. Преобразует командную строку к виду argc/argv. */

    #include "EvryThng.h"


    VOID GetArgs(LPCTSTR Command, int *pArgc, LPTSTR argstr[]) {

     int i, icm = 0;

     DWORD ic = 0;

     for (i = 0; ic < _tcslen(Command); i++) {

      while (ic < _tcslen(Command) && Command[ic] != TSPACE && Command [ic] != TAB) {

       argstr[i][icm] = Command[ic];

       ic++;

       icm++;

      }

      argstr[i][icm] = '\0';

      while (ic < _tcslen(Command) && (Command[ic] == TSPACE || Command[ic] == TAB)) ic++;

      icm = 0;

     }

     if (pArgc != NULL) *pArgc = i;

     return;

    }
     







     


    Главная | В избранное | Наш E-MAIL | Добавить материал | Нашёл ошибку | Наверх