рефераты конспекты курсовые дипломные лекции шпоры

Реферат Курсовая Конспект

Function3

Function3 - раздел Компьютеры, Изучение операционной системы Windows Снова Изменим Код Функции: Dword Function3() { Dwo...

Снова изменим код функции:

DWORD Function3()

{

DWORD dwTemp;

// 1 Что-то делаем здесь

__try

{

// 2. Запрашиваем разрешение на доступ

// к защищенным данным, а затем используем их

WaitForSingleObject(g_

hSem, INFINITE);

g_dwProtectedData = 5;

dwTemp = g_dwProtectedData;

// пытаемся перескочить через блок finally

goto ReturnValue:

}

__finally

{

// 3. Даем и другим попользоваться защищенными данными

ReleaseSemaphore(g_hSem, 1, NULL);

}

dwTemp = 9;

// 4. Продолжаем что-то делать

ReturnValue:

return(dwTemp);

}

Обнаружив в блоке try функции Function3 оператор gofo, компилятор генерирует код для локальной раскрутки, чтобы сначала выполнялся блок finаllу. Но на этот раз после finаllу исполняется код, расположенный за меткой RetumValue, так как воз врат из функции не происходит ни в блоке try, ни в блоке finally. B итоге функция возвращает 5. И опять, поскольку бы прервали естественный ход потока управления из try в finally, быстродействие программы — в зависимости от типа процессора — может снизиться весьма значительно.


5 Операции с окнами

5.1 Оконные сообщения

Разрабатывая подсистему управления окнами в Windows 2000 и Windows 98, Microsoft преследовала две основные цели:

· обратная совместимость с 16-разрядной Windows, облегчающая перенос существующих 16-разрядных приложении,

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

К сожалению, эти цели прямо противоречат друг другу. В 16-разрядной Windows передача сообщения в окно всегда осуществляется синхронно отправитель не может продолжить работу, пока окно не обработает полученное сообщение. Обычно так и нужно. Но, если на обработку сообщения потребуется длительное время или если окно «зависнет», выполнение отправителя просто прекратится. А значит, такая операционная система не вправе претендовать на устойчивость к сбоям.

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

Для начала рассмотрим некоторые базовые принципы. Один процесс в Windows может создать до 10 000 User-объектов различных типов — значков, курсоров, оконных классов, меню таблиц клавиш-акселераторов и тд. Когда поток из какого-либо процесса вызывает функцию, создающую один из этих объектов, последний переходит во владение процесса. Поэтому, если процесс завершается, не уничтожив данный объект явным образом, операционная система делает этo за него. Однако два User объектa (окна и ловушки) принадлежат только создавшему их потоку. И вновь, если поток создает окно или устанавливает ловушку, а потом завершается, операционная система автоматически уничтожает окно или удаляет ловушку.

Этот принцип принадлежности окон и ловушек создавшему их потоку оказывает существенное влияние на механизм функционирования окон поток создавший окно, должен обрабатывать все его сообщения. Поясню данный принцип на примере До пустим, поток создал окно, а затем прекратил работу Тогда его окно уже не получит сообщение WM_DESTROY или WM_NCDESTROY, потому что поток уже завершился и обрабатывать сообщения, посылаемые этому окну, больше некому.

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

5.2 Очередь сообщений потока

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

Создавая какой-либо поток, система предполагает, что он не будет иметь отношения к поддержке пользовательского интерфейса. Это позволяет уменьшить объем выделяемых ему системных ресурсов. Но, как только поток обратится к той или иной GUI-функции (например, для проверки очереди сообщений или создания окна), система автоматически выделит ему дополнительные ресурсы, необходимые для выполнения задач, связанных с пользовательским интерфейсом. А если конкретнее, то система создает структуру THREADINFO и сопоставляет ее с этим потоком.

Элементы этой структуры используются, чтобы обмануть поток — заставить его считать, будто он выполняется в среде, принадлежащей только ему. THREADINFO — это внутренняя (недокументированная) структура, идентифицирующая очередь асинхронных сообщений потока (posted-message queue), очередь синхронных сообщений потока (sent-message queue), очередь ответных сообщений (reply-message queue), оче редь виртуального ввода (virtualized input queue) и флаги пробуждения (wakc flags), она также включает ряд других переменных-членов, характеризующих локальное состояние ввода для данного потока.

 

5.3 Посылка асинхронных сообщений в очередь потока

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

BOOL PostMessage( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

При вызове этой функции система определяет, каким потоком создано окно, идентифицируемое параметром hwnd, Далее система выделяет блок памяти, сохраняет в нем параметры сообщения и записывает этот блок в очередь асинхронных сообщений данного потока. Кроме того, функция устанавливает флаг пробуждения QS_POST MESSAGE (о нем — чуть позже). Возврат из PostMessage происходит сразу после того, как сообщение поставлено в очередь, поэтому вызывающий поток остается в неведении, обработано ли оно процедурой соответствующего окна. На самом деле вполне вероятно, что окно даже не получит это сообщение Такое возможно, если поток, создавший это окно, завершится до того, как обработает все сообщения из своей очереди.

Сообщение можно поставить в очередь асинхронных сообщений потока и вызовом PostThreadMessage:

BOOL PostThreadMessage (DWORD dwThreadId, UINT uMsg, WPARAM wParam, LPARAM lParam);

Какой поток создал окно, можно определить с помощью GetWindowThreadPro cessId:

DWORD GetWindowThreadProcessId (HWND hwnd PDWORD pdwProccssId);

Она возвращает уникальный общесистемный идентификатор потока, который создал окно, определяемое параметром hwnd. Передав адрес переменной типа DWORD в параметре pdwProcessId, можно получить и уникальный общесистемный идентификатор процесса, которому принадлежит этот поток. Но обычно такой идентификатор не нужен, и мы просто передаем NULL.

Нужный поток идентифицируется первым параметром, dwThreadId.Когда сообщение помещено в очередь, элемент hwnd структуры MSG устанавливается как NULL. Применяется эта функция, когда приложение выполняет какую то особую обработку в основном цикле выборки сообщений потока, — в этом случае он пишется так, что бы после выборки сообщения функцией GetMessage (или PeekMessage) код в цикле сравнивал hwnd с NULL и, выполняя эту самую особую обработку, мог проверить значение элемента msg структуры MSG. Если поток определил, что сообщение не адресовано какому-либо окну, DispatchMessage не вызывается, и цикл переходит к выборке следующего сообщения.

Как и PostMessage, функция PostThreadMessage возвращает управление сразу после того, как сообщение поставлено в очередь потока. И вновь вызывающий поток остается в неведении о дальнейшей судьбе сообщения.

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

VOID PostOuitMessage(int nExilCode);

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

PostThreadMessage(GetCurrentThreadId(), WM_OUIT, nExitCode, 0);

Но в действительности PostQuitMessage не помещает сообщение ни в одну из очередей структуры THREADINFO. Эта функция просто устанавливает флаг пробуждения QS_QUIT (о нем я тоже расскажу чуть позже) и элемент nExitCode структуры THREAD INFO. Так как эти операции не могут вызвать ошибку, функция PostQuitMessage не возвращает никаких значений (VOID).

 

5.4 Посылка синхронных сообщений окну

Оконное сообщение можно отправить непосредственно оконной процедуре вызовом SendMessage:

LRESULT SendMessage( HWNO hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

Оконная процедура обработает сообщение, и только по окончании обработки функция SendMessage вернет управление. Благодаря этому ее используют гораздо чаще, чем PostMessage или PostThreadMessage. При переходе к выполнению следующей строки кода поток, вызвавший SendMessage, может быть уверен, что сообщение уже обработано.

Вот как работает SendMessage. Если поток вызывает SendMessage для посылки сообщения окну, созданному им же, то функция просто обращается к оконной процедуре соответствующего окна как к подпрограмме. Закончив обработку, оконная процедура передает функции SendMessage некое значение, а та возвращает его вызвавшему потоку.

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

Во-первых, переданное сообщение присоединяется к очереди сообщений потока-приемника, в результате чего для этого потока устанавливается флаг QSSEND MESSAGE. Во-вторых, если поток-приемник в данный момент выполняет какой-то код и не ожидает сообщений (через вызов GetMessage, PeekMessage или WaitMessage), переданное сообщение обработать не удастся — система не прервет работу потока для немедленной обработки сообщения. Но когда поток-приемник ждет сообщений, система сначала проверяет, установлен ли флаг пробуждения QS_SENDMESSAGE, и, если да, просматривает очередь синхронных сообщений, отыскивая первое из них. В очереди может находиться более одного сообщения Скажем, несколько потоков одно временно послали сообщение одному и тому же окну. Тогда система просто ставит эти сообщения в очередь синхронных сообщений потока.

Итак, когда поток ждет сообщений, система извлекает ил очереди синхронных сообщений первое и вызывает для ею обработки нужную оконную процедуру. Если таких сообщений больше нет, флаг QS_SENDMESSAGE сбрасывается. Пока поток-приемник обрабатывает сообщение, поток, отправивший сообщение через SendMessage, простаивает, ожидая появления сообщения в очереди ответных сообщений По окончании обработки значение, возвращенное оконной процедурой, передается асинхронно в очередь ответных сообщений потока-отправителя Теперь он пробудится и извлечет упомянутое значение из ответного сообщения. Именно это значение и будет результатом вызова SendMessage. C этого момента поток-отправитель возобновляет работу в обычном режиме

Ожидая возврата управления функцией SendMessage, поток в основном простаивает. Но кое-чем он может заняться, если другой поток посылает сообщение окну, созданному первым (ожидающим) потоком, система тут же обрабатывает это сообщение, не дожидаясь, когда поток вызовет GetMessage, PeekMessage или WaitMessage.

Избегать подобных ситуаций позволяют четыре функции, и первая из них — SendMessageTimeout

LRESULT SendMessageTimeout( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT fuFlags, UINT uTimeout, PDWORD_PTR pdwResult);

Она позволяет задавать отрезок времени, в течение которого Вы готовы ждать ответа от другого потока на Ваше сообщение. Ее первые четыре параметра идентичны параметрам функции SendMessage. В параметре fuFlagsможно передавать флаги SMTO_NORMAL (0), SMTO_ABORTIFHUNG, SMTO_BLOCK, SMTO_NOTIMEOUTIFNO THUNG или комбинацию этих флагов.

Флаг SMTO_ABORTIFHUNG заставляет SendMessageTimeout проверить, не завис ли ноток приемник, и, если да, немедленно вернуть управление Флаг SMTO_NOTIME OUTIFNOTHUNG сообщает функции, что она должна игнорировать ограничение по времени, если поток-приемник не завис. Флаг SMTO_BLOCK предотвращает обработку вызывающим потоком любых других синхронных сообщений до возврата из Send MessageTimeout, Флаг SMTO_NORMAL определен в файле WinUser.h как 0, он используется в том случае, если Вы не указали другие флаги.

Как говорилось выше, ожидание потоком окончания обработки синхронного сообщения может быть прервано для обработки другого синхронного сообщения. Флаг SMTO_BLOCK предотвращает такое прерывание. Он применяется, только если поток, ожидая окончания обработки своего сообщения, не в состоянии обрабатывать прочие синхронные сообщения. Этот флаг иногда приводит к взаимной блокировке по токов до конца таймаута. Так, если Ваш поток отправит сообщение другому, а тому нужно послать сообщение Вашему, ни один из них не сможет продолжить обработку, и оба зависнут

Параметр uTimeout определяет таймаут время (в миллисекундах), в течение которого Вы готовы ждать ответного сообщения. При успешном выполнении функция возвращает TRUE, а результат обработки сообщения копируется по адресу, указанному в параметре pdwResult,

Кстати, прототип этой функции в заголовочном файле WinUser.h неверен. Функцию следовало бы определить как возвращающую значение типа BOOL, поскольку значение типа LRFSULT на самом деле возвращается через ее параметр. Это создает определенные проблемы, так как SendAlebbageTimeout вернет FALSE, если Вы переда дите неверный описатель окна или если закончится заданный период ожидания. Единственный способ узнать причину неудачного завершения функции — вызвать GetLast Error. Последняя вернет 0 (ERROR_SUCCESS), если ошибка связана с окончанием периода ожидания. А если причина в неверном описателе, GetLastError даст код 1400 (ERROR_INVALID_WINDOW_HANDLE).

Если Вы обращаетесь к SendMessageTimeout для посылки сообщения окну, создан ному вызывающим потоком, система просто вызывает оконную процедуру, помещая возвращаемое значение в pdwResult. Из-за этого код, расположенный за вызовом

Операционная система считает поток зависшим, если он прекращает обработку сообще ний более чем на 5 секунд.

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

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

BOOL SendMessageCallhack( HWND hwnd, UINT uHsg, WPARAM лРагат, LPARAM lParam, SENDASYNCPROC pfnResultCallBack, ULONG_PTR dwOata);

И вновь первые четыре параметра идентичны параметрам функции SendMessage При вызове Вашим потоком SendMessageCallback отправляет сообщение в очередь синхронных сообщений потока-приемника и тут же возвращает управление вызывающему (т e Вашему) потоку Закончив обработку сообщения, поток-приемник асинхронно отправляет свое сообщение в очередь ответных сообщений Вашего потока. Позже система уведомит Ваш поток об этом, вызвав написанную Вами функцию; у нее должен быть следующий прототип,

VOID CALLBACK ResultCallBack (HWND hwnd. UINT uMsg, ULONG_PIR dwData, LRESULT lResult);

Адрес этой функции обратного вызова передается SendMessageCallback в параметре pfnResultCallBack. А при вызове ResultCallBack в первых двух параметрах передаются описатель окна, закончившего обработкусообщения, и код (значение) самого сообщения. Параметр dwData функции ResultCallBack всегда получает значение, передан ное SendMessageCallback в одноименном параметре. (Система просто берет то, что указано там, и передает Вашей функции ResultCallBack) Последний параметр функ ции ResultCallBack сообщает результат обработки сообщения, полученный от окон ной процедуры.

Поскольку SendMessageCallback, передавая сообщение другому потоку, немедленно возвращает управление,ResultCallBack вызывается после обработки сообщения потоком-приемником не сразу, а с задержкой. Сначала поток-приемник асинхронно ставит сообщение в очередь ответных сообщений потока-отправителя Затем при первом же вызове потоком-отправителем любой из функций GetMessage, PeekMessage, WaitMessage или одной из Send-функций сообщение извлекается из очереди ответных сообщений, и лишь потом вызывается Ваша функцияResultCallback.

Существует и другое применение функции SendMessageCallback В Windows предусмотрен метод, позволяющий разослать сообщение всем перекрывающимся окнам (overlapped windows) в системе; он состоит в том, что Вы вызываете SendMessage и в параметре hwnd передаете ей HWND_BROAUCAST (определенный как -1) Этот метод годится только для широковещательной рассылки сообщений, возвращаемые значения которых Вас не интересуют, поскольку функция способна вернуть лишь одно значение, LRESULT. Но, используя SendMessageCallback, можно получить результаты обработки "широковещательного" сообщения от каждого перекрытого окна Ваша функцияSendMessageCallback будет вызываться с результатом обработки сообщения от каждого из таких окон.

Если SendMessageCallback вызывается для отправки сообщения окну, созданному вызывающим потоком, система немедленно вызывает оконную процедуру, а после обработки сообщения — функцию ResultCallBack, После возврата из ResultCallback выполнение начинается со строки, следующей за вызовом SendMessageCallback.

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

BOOL SendNotifyMessage (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

Поместив сообщение в очередь синхронных сообщений потока-приемника, она немедленно возвращает управление вызывающему потоку. Так ведет себя и PostMessage, помните? Но два отличия SendNotifyMessage отPostMessage все же есть.

Во-первых, если SendNotifyMessage посылает сообщение окну, созданномудругим потоком, приоритет данного синхронного сообщения выше приоритета асинхрон ных сообщений, находящихся в очереди потока-приемника Иными словами, сообщения, помещаемые в очередь с помощью SendNolifyMessage, всегда извлекаются до выборки сообщений, отправленных через PostMessage.

Во-вторых, если сообщение посылается окну, созданному вызывающим потоком, SendNotifyMessage работает точно так же, как и SendMessage, тe не возвращает управление до окончания обработки сообщения

Большинство синхронных сообщений посылается окну для уведомления — что бы сообщить ему об изменении состояния и чтобы оно как-то отреагировало на это, прежде чем Вы продолжите свою работу. Например, WM_ACTIVATE, WM_DESTROY, WM_ENABLE, WM_SIZE, WM_SETFOCUS, WM_MOVE и многие Другие сообщения - это просто уведомления, посылаемые системой окну в синхронном, а не асинхронном режиме. Поэтому система не прерывает свою работу только ради того, чтобы окон ная процедура могла их обработать. Прямо противоположный эффект дает отправка сообщения WM_CREATE — тогда система ждет, когда окно закончит его обработку. Если возвращено значение -1, значит, окно не создано.

И, наконец, четвертая функция, связанная с обработкой межпоточных сообщений:

BOOL ReplyMessage(LRESULT lResult);

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

Поток, вызывающий ReplyMessage, передаст результат обработки сообщения через параметр lResult После вызова ReplyMessage выполнение потока-отправителя возобновляется, а поток, занятый обработкой сообщения, продолжает эту обработку. Ни один из потоков не приостанавливается — оба работают, как обычно. Когда поток, обрабатывающий сообщение, выйдет из своей оконной процедуры, любое возвращаемое значение просто игнорируется.

Заметьте: ReplyMessage надо вызывать из оконной процедуры, получившей сообщение, но не из потока, вызвавшего одну из Send-функций. Поэтому, чтобы написать "защищенный от зависаний" код, следует заменить все вызовы SendMessage вызовами одной из трех Send-функций и не полагаться на то, что оконная процедура будет вызывать именно ReplyMessage.

Учтите также, что вызов ReplyMessage при обработке сообщения, посланного этим же потоком, не влечет никаких действий. На это и указывает значение, возвращаемое ReplyMessage- TRUE. — при обработке межпоточного сообщения и FALSE — при попытке вызова функции для обработки внутрипоточного сообщения.

Если Вас интересует, является обрабатываемое сообщение внутрипоточным или межпоточным, вызовите функцию InSendMessage:

BOOL InSendMessage();

Имяэтой функции не совсем точно соответствует тому, что она делает в действительности. На первый взгляд, функция должна возвращать TRUE, если поток обрабатывает синхронное сообщение, и FALSE — при обработке им асинхронного сообщения. Но это не так. Она возвращает TRUE, если поток обрабатывает межпоточное синхронное сообщение, и FALSE — при обработке им внутрипоточного сообщения (синхронного или асинхронного). Возвращаемые значения функций lnSendMessage и ReplyMessage идентичны.

Есть еще одна функция, позволяющая определить тип сообщения, которое обра батывается Вашей оконной процедурой:

DWORD InSendMessageEx(PVOID pvReserved);

Вызывая ее, Вы должны передать NULL в параметре pvReserved. Возвращаемое значение указывает на тип обрабатываемого сообщения. Значение ISMEX_NOSEND (0) говорит о том, что поток обрабатывает внутрипоточное синхронное или асинхронное сообщение. Остальные возвращаемые значения представляют собой комбинацию битовых флагов, описанных в следующей таблице:

Флаг Описание
ISMEX_ SEND Поток обрабатывает межпоточное синхронное сообщение, посланное через SendMessage или SendMessageTtmeout; если флаг ISMEX REPLIED не установлен, поток-отправитель блокируется в ожидании ответа
ISMEX_NOTIFY Поток обрабатывает межпоточное синхронное сообщение, посланное через SendNotify Message, поток-отправитель не ждет ответа и не блокируется
ISMEX_CALLBACK Поток обрабатывает межпоточное синхронное сообщение, посланное через SendMessageCallback; поток- отправитель не ждет ответа и не блокируется
ISMEX_REPLIED Поток обрабатывает межпоточное синхронное сообщение и уже вызвал ReplyMessage; поток-отправитель не блокируется

Список API-функций с ссылками на литературу представлен в приложении 1.


6 Invoke

 

При использовании директивы Invoke вызов функции становится еще проще по двум причинам: Во-первых, можно забыть о добавке @N. Во-вторых, эта команда сама заботится о помещении передаваемых параметров в стек. Вызов принимает вид:

INVOKE MessageBoxA, HW, OFFSET STR2, OFFSET STR1, MB_OK.

Как видите, все весьма просто и ничуть не сложнее, как если бы Вы вызывали эту функцию на Си или Delphi. Результат выполнения любой функции — это, как правило, целое число, которое возвращается в регистре EAX.


Приложение 1. Справочник API-функций и сообщений Windows.

Таблица 1. Функции API.

  Назначение функции Где существенным образом упоминается в [1]
AllocConsole Создать консоль Глава 2.2. Консольные приложения.
Arc Рисовать дугу Упоминание в Главе 2.1.
BeginPaint Получить контекст при получении сообщения WM_PAINT Глава 2.1. См. программу на Рис. 2.1.1.
BitBlt Скопировать виртуальную прямоугольную область в окно Глава 2.1 и программа на Рис. 2.1.6.
CallNextHookEx Продолжить выполнение других фильтров. Глава 3.7, раздел "Фильтры".
CallWindowProc Вызвать процедуру окна. Глава 3.5. Использование подклассов.
CharToOem Функция перекодировки строки. Глава 2.2. Программа на Рис. 2.2.3.
CloseHandle Закрыть объект: файл, консоль, коммуникационный канал, созданный функцией CreateFile, CreatePipe и т.п. Глава 2.5.
CreateCompatibleBitmap Создать карту бит, совместимую с заданным контекстом. Глава 2.1, программа на Рис. 2.1.6.
CreateCompatibleDC Создать контекст, совместимый с данным окном. Глава 2.1, программа на Рис. 2.1.6.
CreateDialogParam Создать немодальное диалоговое окно. Глава 2.3, программа на Рис. 2.3.5.
CreateEvent Создать событие. Глава 3.2. События.
CreateFile Создать или открыть файл, консоль, коммуникационный канал и т.п. Глава 2.5.
CreateFileMapping Создать отображаемый файл. Глава 3.5, раздел II.
CreateFont Задать параметры шрифта. Упоминается в главе 2.1.
CreateFontIndirect Задать параметры шрифта. Глава 2.1.
CreateMutex Создать объект синхронизации "взаимоисключение" Глава 3.2. Взаимоисключения.
CreatePen Создать перо. Глава 2.1, раздел III.
CreatePipe Создать канал обмена информацией. Глава 3.5, раздел IV.
CreateProcess Создать новый процесс. Глава 3.2. программа 3.2.1.
CreateSemaphore Создать семафор. Глава 3.2. Семафоры.
CreateSolidBrush Определить кисть. Глава 2.1, программа на Рис. 2.1.1.
CreateThread Создать поток. Глава 3.2, программа на Рис. 3.2.2.
CreateWindow Создать окно. Глава 1.2. Начала программирования в Windows.
CreateWindowEx Расширенное создание окна. Глава 1.2.
DefWindowProc Вызывается для сообщений, которые не обрабатываются функцией окна. Глава 1.2, программа на Рис. 1.2.1.
DeleteCriticalSection Удалить объект "критическая секция". Глава 3.2. Критические секции.
DeleteDC Удалить контекст, полученный посредством функций типа CreatePen или CreateDC. Глава 2.1, программа на Рис. 2.1.6.
DeleteObject Удалить объект, выбранный функцией SelectObject. Глава 2.1, программа на Рис. 2.1.3.
DestroyMenu Удалить меню из памяти. Глава 2.4, программа на Рис. 2.4.1.
DestroyWindow Удалить окно из памяти. Глава 2.3, программа на Рис. 2.3.5.
DeviceIoControl Вызов сервиса динамического виртуального драйвера. Глава 4.7. См. раздел "Динамические драйверы".
DialogBox Создать модальное диалоговое окно. Глава 2.3.
DialogBoxParam Создать немодальное диалоговое окно. Глава 2.3, программа на Рис. 2.3.2.
DispatchMessage Вернуть управление Windows с передачей сообщения предназначенному окну. Глава 1.2.
Ellipse Рисовать эллипс. Глава 2.1.
EndDialog Удалить модальное диалоговое окно. Глава 2.3. См. Рис. 2.3.2.
EndPaint Удалить контекст, полученный при помощи BeginPaint. Глава 2.1, программа на Рис. 2.1.1.
EnterCriticalSection Войти в критическую секцию. Глава 3.2. Критические секции.
EnumWindows Пересчитать окна. Глава 3.5, раздел VIII.
ExitProcess Закончить данный процесс со всеми подзадачами (потоками). Глава 1.2.
ExitThread Выход из потока с указанием кода выхода. Глава 3.2.
FindFirstFile Первый поиск файлов в каталоге. Глава 2.5. Поиск файлов.
FindNextFile Осуществить последующий поиск в каталоге. Глава 2.5. Поиск файлов.
FlushViewOfFile Сохранить отображаемый файл или его часть на диск. Глава 3.5.
FreeConsole Освободить консоль. Глава 2.2. См. программу на Рис. 2.2.3.
FreeLibrary Выгрузить динамическую библиотеку. Глава 3.3. См. программу на Рис. 3.3.3.
GetCommandLine Получить командную строку программы. Глава 2.2.
GetCursorPos Получить положение курсора в экранных координатах. Глава 3.1, программа на Рис. 3.1.3.
GetDC Получить контекст окна. Глава 2.1. См. программу на Рис. 2.1.6.
GetDiskFreeSpace Определяет объем свободного пространства на диске. Глава 3.4., раздел I.
GetDlgItem Получить дескриптор управляющего элемента в окне. Глава 3.1. См. Рис. 3.1.3.
GetDriveType Получить тип устройства. Глава 3.4. См. программу на Рис. 3.4.1.
GetLocalTime Получить местное время. Глава 3.1. См. программу на Рис. 3.1.2.
GetMenuItemInfo Получить информацию о выбранном пункте меню. Глава 2.4. См. программу на Рис. 2.4.1.
GetMessage Получить очередное сообщение из очереди сообщений данного приложения. Глава 1.2.
GetModuleHandle Получить дескриптор приложения. Глава 1.2, программа на Рис. 1.2.2.
GetProcAddress Получить адрес процедуры (в динамической библиотеке). См. главу 3.3.
GetStdHandle Получить дескриптор консоли. Глава 2.2.
GetStockObject Определить дескриптор стандартного объекта. См. главу 1.4.
GetSystemDirectory Получить системный каталог. Глава 3.2.
GetSystemMetrics Определить значение системных характеристик. Глава 2.1, программа на Рис. 2.1.6.
GetSystemTime Получить время по Гринвичу. Упоминается в главе 3.1.
GetTextExtentPoint32 Определить параметры текста в данном окне. Глава 2.1, программа на Рис. 2.1.2.
GetWindowRect Определить размер окна. Глава 2.1, программа на Рис. 2.1.2.
GetWindowsDirectory Получить каталог Windows. Глава 3.2.
GetWindowText Получить заголовок окна. Глава 3.5, программа на Рис. 3.5.4.
GetWindowThreadProcessId Получить идентификатор процесса. Глава 3.5, программа на Рис. 3.5.4.
GlobalAlloc Выделить блок памяти. Глава 3.7. См. раздел III.
GlobalDiscard Удалить удаляемый блок памяти. Глава 3.7. См. раздел III.
GlobalFree Освободить блок памяти. Глава 3.7. См. раздел III.
GlobalLock Фиксировать перемещаемый блок памяти. Глава 3.7. См. раздел III.
GlobalReAlloc Изменить размер блока памяти. Глава 3.7. См. раздел III.
GlobalUnlock Снять фиксацию блока памяти. Глава 3.7. См. раздел III.
InitializeCriticalSection Создать объект критическая секция. Глава 3.2. Программа на Рис. 3.2.3.
InvalidateRect Перерисовать окно. Глава 2.1. См. программу на Рис. 2.1.6.
KillTimer Удалить таймер. Глава 3.1. См. программу на 3.1.1.
LeaveCriticalSection Покинуть критическую секцию. Глава 3.2. Программа на Рис. 3.2.3.
LineTo Провести линию от текущей точки к заданной. Глава 2.1. Программа на Рис. 2.1.6.
LoadAccelerators Загрузить таблицу акселераторов.  
LoadCursor Загрузить системный курсор или курсор, определенный в файле ресурсов. Глава 1.2.2.
LoadIcon Загрузить системную иконку или иконку, определенную в файле ресурсов. Глава 1.2.2.
LoadLibrary Загрузить динамическую библиотеку. Глава 3.3, программа на Рис. 3.3.3.
LoadMenu Загрузить меню, которое определено в файле ресурсов. Глава 2.3. См. программу на Рис. 2.3.3.
LoadString Загрузить строку, определенную в файле ресурсов. Глава 2.3, программа на Рис. 2.3.2.
lstrcat Производит конкатенацию двух строк. Впервые упоминается в главе 2.5.
lstrcpy Скопировать одну строку в другую. Впервые упоминается в главе 2.5.
lstrlen Получить длину строки. Впервые упоминается в главе 2.5.
MapViewOfFile Скопировать файл или части файла в память. Глава 3.5. См. раздел II.
MessageBox Выдать окно сообщения. Глава 1.2.
MoveToEx Сменить текущую точку. Глава 2.1, программа на Рис. 2.1.6.
MoveWindow Установить новое положение программа окна. Глава 3.1, на Рис. 3.1.3.
OpenEvent Открыть событие. Глава 3.2. См. раздел События.
OpenSemaphore Открыть семафор. Глава 3.2. См. раздел "Семафоры".
PatBlt Заполнить заданную прямоугольную область. Глава 2.1, программа на Рис. 2.1.6.
Pie Рисовать сектор эллипса. Упоминается в главе 2.1.
PostMessage Аналогична SendMessage, но сразу возвращает управление. Глава 3.3, программа на Рис. 3.3.6.
PostQuitMessage Послать текущему приложению сообщение WM_QUIT. Глава 1.2.
ReadConsole Читать из консоли. Глава 2.2. См. раздел II.
ReadFile Читать из файла или того, что было создано функцией CreateFile. Глава 2.5
Rectangle Рисовать прямоугольник. Глава 2.1, раздел III.
RegisterClass Зарегистрировать класс окон. Глава 1.2.
RegisterHotKey Зарегистрировать горячую клавишу. Глава 2.4, программа на Рис. 2.4.2.
ReleaseDC Удалить контекст, полученный при помощи GetDC Глава 2.1, программа на Рис. 2.1.6.
ReleaseSemaphore Освободить семафор Глава 3.2. См. раздел "Семафоры".
ResetEvent Сбросить событие Глава 3.2. См. раздел "События".
ResumeThread Запустить "спящий" процесс. Глава 3.2, раздел II.
RoundRect Рисовать прямоугольник с округленными углами. Глава 2.1.
RtlMoveMemory Копировать блок памяти в другой блок. В помощи по API-функциям она называется MoveMemory. Глава 3.4, программа на Рис. 3.4.4.
SelectObject Выбрать объект (перо, кисть) в указанном контексте. Глава 2.1, программа на Рис. 2.1.3.
SendDlgItemMessage Послать сообщение управляющему элементу окна. Глава 2.4.
SendMessage Послать сообщение окну. Глава 1.3, программа на Рис. 1.3.2.
SetBkColor Установить цвет фона для вывода текста. Глава 2.1. Программа на Рис. 2.1.1.
SetConsoleCursorPosition Установить курсор в заданную позицию в консоли. Глава 2.2, программа на Рис. 2.2.3.
SetConsoleScreenBufferSize Установить размер буфера консоли. Глава 2.2, программа на Рис. 2.2.3.
SetConsoleTextAttribute Установить цвет текста в консоли. Глава 2.2, программа на Рис. 2.2.3.
SetConsoleTitle Установить название окна консоли. Глава 2.2, программа на Рис. 2.2.3.
SetEvent Подать сигнал о наступлении события. Глава 3.2. См. раздел "События".
SetFocus Установить фокус на заданное окно. Глава 1.3.
SetLocalTime Установить время и дату. Упоминается в главе 3.1.
SetMapMode Установить соотношение между логическими единицами и пикселями. Упоминается в главе 2.1.
SetMenu Назначить новое меню данному окну. Глава 2.3, программа на Рис. 2.3.3.
SetPixel Установить заданный цвет пикселя. Глава 2.1, программа на Рис. 2.1.6.
SetSystemTime Установить время, используя гринвичские координаты. Упоминается в главе 3.1.
SetTextColor Установить цвет текста. Глава 2.1, программа на Рис. 2.1.1.
SetTimer Установить таймер. Глава 3.1.
SetViewportExtEx Установить область вывода. Глава 2.1.
SetViewportOrgEx Установить начало области вывода. Глава 2.1.
SetWindowLong Изменить атрибут уже созданного окна. Глава 3.5. См. раздел III.
SetWindowsHookEx Установить процедуру-фильтр. Глава 3.7, программа на Рис. 3.7.5.
Shell_NotifyIcon Посредством данной функции можно поместить иконку приложения на системную панель. Глава 3.5. См. программу на Рис. 3.5.1.
SHFileOperation Осуществляет групповую операцию над файлами и каталогами. Глава 3.5. См. раздел VI.
SHGetDesktopFolder Выводит диалоговое окно для выбора каталогов и файлов. Глава 3.5. См. раздел VI.
ShowWindow Показать окно, установить статус показа. Глава 1.2.
Sleep Вызывает задержку. Глава 3.2. см. рис. 3.2.2.
TerminateProcess Уничтожить процесс. Глава 3.2. См. программу на Рис. 3.2.1.
TerminateThread Удалить поток. Глава 3.2. См. программу 3.2.1.
TextOut Вывести текст в окно. Глава 2.1.
timeKillEvent Удалить таймер. Глава 2.2. См. раздел III.
timeSetEvent Установить таймер. Глава 2.2. См. раздел III.
TranslateAccelerator Транслирует акселераторные клавиши в команду выбора пункта меню. Глава 2.3. См. раздел III.
TranslateMessage Транслировать клавиатурные сообщения в ASCII-коды. Глава 1.2.
UnhookWindowsHookEx Снять процедуру-фильтр. Глава 3.6. Программа на Рис. 3.6.5.
UnmapViewOfFile Сделать указатель на отображаемый файл недействительным. Глава 3.5. См. раздел II.
UnregisterHotKey Снять регистрацию горячей клавиши. Глава 2.4, программа на Рис. 2.4.2.
UpdateWindow Обновить рабочую область окна. Глава 1.2.
VirtualAlloc Зарезервировать блок виртуальной памяти или отобразить на него физическую память. Глава 3.6. См. раздел III.
VirtualFree Снять резервирование с блока виртуальной памяти или сделать блок виртуальной памяти неотображенным. Глава 3.6. См. раздел III.
WaitForSingleObject Ожидает одно из двух событий: определенный объект сигнализирует о своем состоянии, вышло время ожидания (TimeOut). Работает с такими объектами, как семафор, событие, взаимоисключение, процесс, консольный ввод и др. Глава 3.2. См. раздел "Семафоры".
WNetAddConnection2 Осуществляет соединение с сетевым ресурсом локальной сети. Глава 3.4.
WNetCancelConnection2 Отсоединить от ресурса локальной сети. Глава 3.4.
WNetCloseEnum Найти все ресурсы локальной сети данного уровня. Глава 3.4.
WNetGetConnection Получить информацию о данном соединении. Глава 3.4.
WNetOpenEnum Открыть поиск ресурсов в локальной сети. Глава 3.4.
WriteConsole Вывод в консоль. Глава 2.2, программа на Рис. 2.2.1.
wsprintf Преобразовать последовательность параметров в строку. Глава 2.2. См. программу на Рис. 2.2.4.

 

Таблица 2. Сообщение операционной системы Windows.

Сообщение системы Назначение Где существенным образом упоминается в [1]
WM_ACTIVATE Посылается функции окна перед активизацией и деактивизацией этого окна. Глава 2.4.
WM_ACTIVATEAPP Посылается функции окна перед активизацией окна другого приложения. Глава 2.4.
WM_CHAR Сообщение, возникающее при трансляции сообщения WM_KEYDOWN функцией TranslateMessage. Главы 1.2, 2.4.
WM_CLOSE Сообщение, приходящее на процедуру окна при его закрытии. Приходит до WM_DESTROY. Дальнейшее выполнение DefWindowProc, EndDialog или WindowsDestroy и вызывает появление сообщения WM_DESTROY. Глава 2.3.
WM_COMMAND Сообщение, приходящее на функцию окна, при наступлении события с управляющим элементом, пунктом меню, а также от акселератора. Главы 1.3, 2.3.
WM_CREATE Первое сообщение, приходящее на функцию окна при его создании. Приходит один раз. См. подробнее Гл. 1.2.
WM_DEADCHAR Сообщение, возникающее при трансляции сообщения WM_KEYUP функцией TranslateMessage. Глава 1.2.
WM_DESTROY Сообщение, приходящее на функцию окна при его уничтожении. Подробнее см. Гл. 1.2.
WM_GETTEXT Посылается окну для получения текстовой строки, ассоциированной с данным окном (строка редактирования, заголовок окна и т.д.). Глава 1.3, см. программу на Рис. 1.3.2.
WM_HOTKEY Генерируется при нажатии горячей клавиши. Глава 2.4 и программа на Рис. 2.4.2.
WM_INITDIALOG Сообщение, приходящее на функцию диалогового окна вместо сообщения WM_CREATE. Глава 2.3.
WM_KEYDOWN Сообщение, генерируемое при нажатии клавиши клавиатуры и посылаемое окну, имеющему фокус ввода. Главы 1.2, 2.3.
WM_KEYUP Сообщение, генерируемое при отпускании клавиши клавиатуры и посылаемое окну, имеющему фокус ввода. Главы 1.2, 2.3.
WM_LBUTTONDOWN Сообщение генерируется при нажатии левой кнопки мыши. Глава 1.2.
WM_MENUSELECT Посылается окну, содержащему меню, при выборе пункта меню. Глава 2.4.
WM_PAINT Сообщение посылается окну перед его перерисовкой. Главы 1.2, 1.3.
WM_QUIT Сообщение, приходящее приложению (не окну) при выполнении функции PostQuitMessage. При получении этого сообщения происходит выход из цикла ожидания и, как следствие, выход из программы. Глава 1.2. См. комментарий к программе на Рис. 1.2.2.
WM_RBUTTONDOWN Сообщение генерируется при нажатии правой кнопки мыши. Глава 1.2, программа на рис. 1.2.2.
WM_SETFOCUS Сообщение, посылаемое окну, после того, как оно получило фокус. Глава 1.3, программа на Рис.1.3.2
WM_SETICON Приложение посылает окну данное сообщение, чтобы ассоциировать с ним новую иконку (значок). Глава 2.3.
WM_SETTEXT Сообщение, используемое приложением для посылки текстовой строки окну и интерпретируемое в зависимости от типа окна (обычное окно - заголовок, кнопка — надпись на кнопке, окно редактирования - содержимое этого окна и т.д.). Глава 1.3, см. программу на Рис. 1.3.2.
WM_SIZE Посылается функции окна после изменения его размера. Глава 3.5, см. программу на Рис. 3.5.1.
WM_SYSCHAR Сообщение, возникающее при трансляции сообщения WM_SYSKEYDOWN функцией TranslateMessage. Глава 1.2.
WM_SYSCOMMAND Генерируется при выборе пунктов системного меню или меню окна. Глава 2.3. См. также Рис. 2.3.4.
WM_SYSDEADCHAR Сообщение, возникающее при трансляции сообщения WM_SYSKEYUP функцией TranslateMessage. Глава 1.2.
WM_SYSKEYDOWN Сообщение аналогично WM_KEYDOWN, но генерируется, когда нажата и удерживается еще и клавиша Alt. Главы 1.2, 2.3.
WM_SYSKEYUP Сообщение аналогично WM_SYSKEYDOWN, но генерируется при отпускании клавиши. Главы 1.2, 2.3.
WM_TIMER Сообщение, приходящее на функцию окна или специально определенную таймерную процедуру после определения интервала таймера при помощи функции SetTimer. Глава 3.1 полностью посвящена данному сообщению.
WM_VKEYTOITEM Сообщение окну приложения, когда нажимается какая-либо клавиша при наличии фокуса на данном списке. Список должен иметь свойство LBS_WANTKEYBOARDINPUT. Глава 2.4.

 

 


Приложение 2. Темы курсовой работы.

1. Оптимизация. Методы оптимизации.

2. Фиксация времени выполнения программы.

3. Командные параметры и переменные среды.

4. Управление задачами. Изучение TSS.

5. Страничное управление памятью.

6. Обработка прерываний и исключений в защищенном режиме.

7. Программирование в Windows на основе API-функций.

8. Техника работы с окнами.

9. Сравнительный анализ 16-битного и 32-битного программирования на ассемблере.

10. Сравнительная оценка ассемблеров MASM и TASM.

11. Работа с текстовой информацией при программировании в Windows.

12. Графика в Windows.

13. Консольные приложения. Мышь и клавиатура в консольном приложении.

14. Понятие ресурса. Редакторы и трансляторы ресурсов.

15. Примеры использования ресурсов.

16. Использование API-функций для управления файлами. 32-битная FAT.

17. Макросредства ассемблера в Windows.

18. Работа с таймером.

19. Всплывающие подсказки.

20. Многозадачность в 32-битных операционных системах Windows(Windows 9x, Windows NT, Windows 2000). Создание процессов.

21. Взаимодействие процессов.

22. Синхронизация процессов с помощью критической секции.

23. Распределение процессорного времени. Приостановка задачи.

24. Создание динамических библиотек (DLL).

25. Разделяемая память и динамические библиотеки.

26. Обмен информацией между процессами при помощи канала.

27. Адресное пространство процесса. Управление памятью.

28. Фильтры для отладки программ.

29. Согласование ассемблера с языками высокого уровня.

30. Драйверы VXD, статические и динамические.

 


Список литературы

1. Пирогов В. Ю. Ассемблер для Windows. — СПб. : -Петербург, 2002 г.

2. Пирогов В. Ю. Ассемблер. Учебный курс. — СПб. : БХВ-Петербург, 2001 г.

3. Дж. Рихтер. Windows для профессионалов. Создание эффективных Win32-пpилoжeний с учетом специфики 64-разрядной версии Windows. — СПб.: Питер., 2005 г.

– Конец работы –

Эта тема принадлежит разделу:

Изучение операционной системы Windows

Федеральное агентство по образованию... Государственное образовательное учреждение высшего профессионального... Ижевский государственный технический университет...

Если Вам нужно дополнительный материал на эту тему, или Вы не нашли то, что искали, рекомендуем воспользоваться поиском по нашей базе работ: Function3

Что будем делать с полученным материалом:

Если этот материал оказался полезным ля Вас, Вы можете сохранить его на свою страничку в социальных сетях:

Все темы данного раздела:

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

Fuction1
Чтобы оценить последствия применения обработчиков завершения, рассмотрим более конкретный пример: DWORD Function1() { DWORD dwTemp; // 1 Что-то делаем здесь __try

Funcion2
Теперь чуть-чуть изменим код функции и посмотрим, что получится: DWORD Funcion2() { DWORD dwTemp; // Что-то делаем здесь ... __try { /

Хотите получать на электронную почту самые свежие новости?
Education Insider Sample
Подпишитесь на Нашу рассылку
Наша политика приватности обеспечивает 100% безопасность и анонимность Ваших E-Mail
Реклама
Соответствующий теме материал
  • Похожее
  • Популярное
  • Облако тегов
  • Здесь
  • Временно
  • Пусто
Теги