Создание эффективных WIN32-приложений с учетом специфики 64-разрядной версии Windows

ка еще раз первый вариант


Перспишем- ка еще раз первый вариант (Funcaramal), задействовав преимущества обработки завершения

BOOL Funcarama3()
{
// Внимание! Инициализируйте все переменные, предполагая худшее

HANDLE hFile = INVALID_HANDLE_VALUE;
PVOID pvBuf = NULL;

__try
{

DWORD dwNumBytesRead;
BOOL fOk;

hFile = CreateFile("SOMEDATA.DAT". GENERIC_READ,
FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);

if (hFile == INVALID_HANDLE_VALUE)
{
return(FALSE);
}

pvBuf = VirtualAlloc(NULL, 1024, MEM_COMMIT, PAGE_READWRITE);
if (pvBuf == NULL)
{
return(FALSE);
}

fOk = ReadFile(hFile, pvBuf, 1024, &dwNumBytesRead, NULL);
if (ifOk (dwNumBytesRead != 1024))
{
return(FALSE);
}

// что-то делаем с данными

...

}

__finally
{

// очистка всех ресурсов
if (pvBuf != NULL)
VirtualFree(pvBuf, MEM_RELEASE | MEM_DECOMMIT);

if (hFile != INVALID_HANDLE_VALUE)
CloseHandle(hFile);

}

// продолжаем что-то делать
return(TRUE);

}

Главное достоинство Funcarama3 в том, что весь код, отвечающий за очистку, со бран в одном месте — в блоке finally. Если понадобится включить что-то в эту функ цию, то для очистки мы просто добавим одну-единственную строку в блок finally — возвращаться к каждому месту возможного возникновения ошибки и вставлять в него строку для очистки не нужно


Содержание раздела