double arrow

Поиск и удаление из реестра заданной информации


Сначала рассказать из вопроса 14 про реестр и .reg-файлы

 

Чтобы удалить раздел реестра с помощью REG-файла, необходимо поместить дефис (-) перед путем_реестра REG-файла. Например, чтобы удалить подраздел Тест из раздела реестра:

HKEY_LOCAL_MACHINE\Software

 

в REG-файле, необходимо добавить дефис в начале следующего раздела реестра:

 

HKEY_LOCAL_MACHINE\Software\Test

В следующем примере имеется REG-файл, который может выполнить эту задачу.

[

-HKEY_LOCAL_MACHINE\Software\Test

]

 

Чтобы удалить значение реестра с помощью REG-файла, необходимо поместить дефис (-) после знака равенства и имени_элемента_данных REG-файла. Например, чтобы удалить «ПроверяемоеЗначение» из следующего раздела реестра:

HKEY_LOCAL_MACHINE\Software\Test

Следует добавть дефис после «testvalue» = в REG-файл. В следующем примере приводится REG-файл, который может выполнить эту задачу.

HKEY_LOCAL_MACHINE\Software\Test


«testvalue» =-


Использование функция Post Message и Send Message для обмена сообщениями Windows

 

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




 

SendMessage, принимающая сторона обрабатывает сообщение немедленно, вместо того, чтобы обработать его в очереди в порядке поступления. Например, предположим, что вы написали:

1 2 3 4 5 6 7 8 9 var Wnd: HWND; S: String; ... SendMessage(Wnd, WM_SETTEXT, 0, Integer(PChar('ВАСЯ'))); SetLength(S, GetWindowTextLength(Wnd)); GetWindowText(Wnd, PChar(S), Length(S)); SetLength(S, StrLen(PChar(S))); // S = 'Fooblitzky'

Этот пример отправляет сообщение WM_SETTEXT в любое окно, которое записано в Wnd. Windows вызывает оконную процедуру этого окна с WM_SETTEXT в качестве идентификатора сообщения, нулём и 'Fooblitzky' как wParam и lParam. Оконная процедура обрабатывает сообщение и возвращает управление; управление возвращается на следующую строчку, которая вызывает GetWindowText. Как вы и ожидаете, S примет значение 'ВАСЯ'. Т.е. SendMessage ведёт себя как вызов функции, где WM_SETTEXT - это функция для вызова.

Что произойдёт, если вместо SendMessage вы используете PostMessage?

1 2 3 4 5 6 7 8 9 var Wnd: HWND; S: String; ... PostMessage(Wnd, WM_SETTEXT, 0, Integer(PChar('ВАСЯ'))); SetLength(S, GetWindowTextLength(Wnd)); GetWindowText(Wnd, PChar(S), Length(S)); SetLength(S, StrLen(PChar(S))); // S = ???

PostMessage не вызывает оконную процедуру. Вместо этого, она добавляет запись TMessage в очередь сообщений потока или процесса, который владеет Wnd, и возвращает управление немедленно. TMessage хранит номер (идентификатор) сообщения и его параметры. Поток или приложение обрабатывают сообщение, когда они доходят до него. Т.е. когда цикл выборки сообщений вызывает GetMessage и она возвращает это WM_SETTEXT (у нас могут быть и другие сообщения в очереди до нашего WM_SETTEXT). В любом случае, PostMessage возвращает управление немедленно, не ожидая ничего этого, так что когда начинает выполняться следующая строка (GetWindowText), то S не будет равно 'ВАСЯ', если только текст окна не был таким до того, как вы вызвали PostMessage.

Итак, есть два способа доставки сообщения окну: SendMessage вызывает оконную процедуру напрямую; PostMessage использует очередь. Рисунок ниже иллюстрирует разницу (AfxWndProc - это оконная процедура):

 







Сейчас читают про: