Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Установочные лекции (Амелин).doc
Скачиваний:
6
Добавлен:
21.08.2019
Размер:
1.31 Mб
Скачать

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

Сначала рассказать из вопроса 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» =-

16. Использование функция 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 - это оконная процедура):