Операционная система Microsoft Windows 3.1 для программиста -том 3


Листинг 3.5. Файл discard/discard.cpp - часть 2


// Восстанавливаем удаленный блок памяти hmemGlDiscard = GlobalReAlloc(hmemGlDiscard, 200000l, GMEM_MOVEABLE | GMEM_DISCARDABLE);

// Фиксируем блок памяти lpvoidGlDiscard = GlobalLock(hmemGlDiscard);

if(lpvoidGlDiscard != (LPVOID) NULL) { // Выводим идентификатор и логический адрес // зафиксированного блока памяти wsprintf(szBuf, "hmemGlDiscard=\t%04.4X\n" "lpvoidGlDiscard=\t%04.4X:%04.4X", hmemGlDiscard, FP_SEG(lpvoidGlDiscard), FP_OFF(lpvoidGlDiscard)); MessageBox(NULL, (LPSTR)szBuf, "Global Block", MB_OK);

// Освобождаем блок памяти GlobalUnlock(hmemGlDiscard); } else { MessageBox(NULL, "Ошибка при фиксировании блока", "Global Block", MB_OK); } } }

// Отдаем удаляемый блок памяти операционной системе GlobalFree(hmemGlDiscard); } else { MessageBox(NULL, "Мало памяти для удаляемого блока", "Global Block", MB_OK); } return 0; }

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

extern "C" BOOL CALLBACK _export NotifyProc(HGLOBAL hglbl);

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

После этого функция WinMain устанавливает процедуру извещения, вызывая функцию GlobalNotify и передавая ей в качестве параметра адрес внешней по отношению к приложению функции извещения NotifyProc, расположенной в DLL-библиотеке:

GlobalNotify((GNOTIFYPROC)NotifyProc);

Каждая копия приложения может вызывать функцию GlobalNotify только один раз.

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


Начало  Назад  Вперед



Книжный магазин