Реферат Курсовая Конспект
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 г.
– Конец работы –
Эта тема принадлежит разделу:
Федеральное агентство по образованию... Государственное образовательное учреждение высшего профессионального... Ижевский государственный технический университет...
Если Вам нужно дополнительный материал на эту тему, или Вы не нашли то, что искали, рекомендуем воспользоваться поиском по нашей базе работ: Function3
Если этот материал оказался полезным ля Вас, Вы можете сохранить его на свою страничку в социальных сетях:
Твитнуть |
Новости и инфо для студентов