Функция WndProc_OnCommand
Функция WndProc_OnCommand обрабатывает сообщение WM_COMMAND, поступающее от главного меню приложения. Выбирая строки меню Set protection, пользователь может изменять тип доступа, разрешенного для блока памяти, заказанного приложением при обработке сообщения WM_CREATE. Меню Memory позволяет пользователю выполнять над этим блоком операции чтения, записи, фиксирования и расфиксирования.
Изменение типа доступа выполняется при помощи функции VirtualProtect. Например, установка типа доступа PAGE_NOACCESS выполняется следующим образом:
VirtualProtect(lpMemoryBuffer, MEMBLOCK_SIZE,
PAGE_NOACCESS, &dwOldProtect);
При этом старый тип доступа записывается в переменную dwOldProtect, но никак не используется нашим приложением.
После изменения типа доступа обработчик сообщения WM_COMMAND изменяет соответствующим образом отметку строк меню Set protection, для чего используется макрокоманда CheckMenuItem.
Теперь рассмотрим обработку сообщения WM_COMMAND в том случае, когда оно приходит от меню Memory.
Если пользователь выполняет попытку чтения блока памяти, выбирая из меню Memory строку Read, выполняется следующий фрагмент кода:
case ID_MEMORY_READ:
{
__try
{
test = *((int *)lpMemoryBuffer);
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
sprintf(chBuff, "Исключение с кодом\n"
"%lX\nпри чтении блока памяти", GetExceptionCode());
MessageBox(hWnd, chBuff,
szAppTitle, MB_OK | MB_ICONEXCLAMATION);
break;
}
MessageBox(hWnd, "Чтение выполнено",
szAppTitle, MB_OK | MB_ICONEXCLAMATION);
break;
}
Здесь в области действия оператора __try, ограниченной фигурными скобками, содержимое первого слова буфера lpMemoryBuffer читается во временную переменную test. Эта, безопасная на первый взгляд операция может привести в приложении Microsoft Windows NT к возникновению исключения, так как соответствующая страница памяти может оказаться недоступной для чтения. Если не предусмотреть обработку исключения, при его возникновении работа приложения завершится аварийно.
Эта функция обрабатывает сообщение WM_COMMAND, поступающее от главного меню приложения. Она не имеет никаких особенностей.
Эта функция обрабатывает сообщение WM_COMMAND, поступающее в главное окно приложения от меню. Когда пользователь выбирает из меню File строку Start process, функция WndProc_OnCommand вызывает функцию StartProcess, определенную в нашем приложении. Последняя отображает на экране стандартную панель выбора программного файла и в случае успешного выбора запускает этот файл на выполнение как отдельный процесс. При этом используются параметры запуска, установленные при помощи диалоговой панели Start Options.
В том случае когда пользователь выбирает из меню File строку Options, на экране отображается модальная диалоговая панель Start Options, имеющая идентификатор MAKEINTRESOURCE(IDD_DIALOG1).
Отображение диалоговой панели выполняется с помощью функции DialogBox:
DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, DlgProc);
Эта функция, а также все, что относится к диалоговым панелям, мы описали в главе “Диалоговые панели” 12 тома “Библиотеки системного программиста”.
Заметим, что в среде 32-разрядных операционных систем Microsoft Windows 95 и Microsoft Windows NT в качестве последнего параметра функции DialogBox можно указывать имя функции диалога. При этом вам не требуется создавать переходник диалоговой функции, вызывая функцию MakeProcInstance. Функция MakeProcInstance не используется 32-разрядными приложениями.