Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Создание эффективных приложений для Windows Джеффри Рихтер 2004 (Книга).pdf
Скачиваний:
375
Добавлен:
15.06.2014
Размер:
8.44 Mб
Скачать

//процесс S никогда не должен пытаться исполнять код,

//закрывающий продублированный описатель

CloseHandle(hObjProcessT);

Если процесс S выполнит этот код, вызов может дать (а может и не дать) ошибку Он будет успешен, если у процесса S случайно окажется описатель с тем же значением, что и в hObjProcessT При этом процесс S закроет неизвестно какой объект, и что будет потом — остается только гадать

Теперь о другом способе применения DuplicateIlandle Допустим, некий процесс имеет полный доступ (для чтения и записи) к объекту "проекция файла" и из этого процесса вызывается функция, которая должна обратиться к проекции файла и считать из нее какие-то данные Так вот, если мы хотим повысить отказоустойчивость приложения, то могли бы с помощью DuplicateHandle создать новый описатель существующего объекта и разрешить доступ только для чтения. Потом мы передали бы этот описатель функции, и та уже не смогла бы случайно что-то записать в проекцию файла. Взглянше на код, который иллюсгрирует этот пример:

int WINAPI WinMain(HINSTANCE hinstExe, HINSTANCE, PSTR pszCmdLine, int nCmdShow) {

//создаем объект "проекция файла",

//его описатель разрешает доступ как для чтения, так и для записи

HANDLE hFileMapRW = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGF_READWRITE, 0, 10240, NULL);

//создаем другой описатель на тот же обьект;

//этог описатель разрешает дocтyп только для чтения

HANDLE hFileMapRO;

DuplicateHandle(GetCurrentProcess(), hFileMapRW, GetCurrentProcess(), &hFileMdpRO, FILE_MAP_READ, FALSE, 0);

//вызываем функцию, которая не должна ничего записывать в проекцию файла

ReadFromTheFileMapping(hFileMapRO);

//закрываем объект "проекция файла" , доступный только для чтения

CloseHandle(hFileMapRO);

//проекция файла нам по-прежнему полностью доступна через hFileMapRW

.

.

.

//если проекция файла больше не нужна основному коду, закрываем

ее

CloseHandle(hFileMapRW);

}

ЧАСТЬ II НАЧИНАЕМ РАБОТАТЬ