Re[6]: как бы передать в шаблон NULL или INVALID_HANDLE_VALU
От: gid_vvp  
Дата: 29.08.06 09:11
Оценка:
IS>Из-за инициализации HANDLE через NULL, а не INVALID_HANDLE_VALUE (в том же ATL::CHandle или если принимаешь уже инициализированный так HANDLE).

1. довольно странная идея использовать одну обёртку для хандлов вместе с другой
2. ATL::CHandle не стоит использовать с хандлами файлов ибо CreateFile в случае ошибки возвращает ни что иное как INVALID_HANDLE_VALUE и следовательно невалидный хандл файла это INVALID_HANDLE_VALUE и ни что больше
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: как бы передать в шаблон NULL или INVALID_HANDLE_VALU
От: gid_vvp  
Дата: 29.08.06 10:11
Оценка:
L>А для того чтобы они не получались одинаковыми есть такая замечательная вещь как наследование. Причём поскольку функции тут только статик, то ты запросто можешь юзать даже множественное наследование (никаких оверхедов не будет).

Имеешь в виду нечто такое?
struct InvalidValuePolicy
{
   typedef HANDLE HandleType;

    static HandleType InvalidValue()
    {
        return NULL;
    }
};

struct CloseHandlePolicy
{
   typedef HANDLE HandleType;

    static void HandleClose(HandleType handle)
    {
        if (IsValid(handle))
        {
            ::FreeLibrary(handle);
        }
    }

};

class ModuleHandlePolicy
    : public InvalidValuePolicy
    , public CloseHandlePolicy
{
public:
     static bool IsValid(HandleType handle)
    {
        return (handle != InvalidValue());
    }
};


помоему ни чем не лучше такого


    HMODULE InvalidValue()
    {
        return NULL;
    }

...
    void HandleClose(HMODULE handle)
    {
        ::FreeLibrary(handle);
    }

...

typedef HandlePolicy<HMODULE, &InvalidValue, &HandleClose> ModuleHandlePolicy;


и намного хуже этого
typedef HandlePolicy<HMODULE, NULL, &::FreeLibrary> ModuleHandlePolicy;
...
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[7]: как бы передать в шаблон NULL или INVALID_HANDLE_VALU
От: IceStudent Украина  
Дата: 29.08.06 10:24
Оценка:
Здравствуйте, gid_vvp, Вы писали:

_>1. довольно странная идея использовать одну обёртку для хандлов вместе с другой

Не вместе. Просто пример реализации.

_>2. ATL::CHandle не стоит использовать с хандлами файлов ибо CreateFile в случае ошибки возвращает ни что иное как INVALID_HANDLE_VALUE и следовательно невалидный хандл файла это INVALID_HANDLE_VALUE и ни что больше

ATL::CHandle — это просто обёртка для HANDLE, чтобы автоматически закрывать хэндл при выходе из области видимости или при исключении.
--
wbr, icestudent
Re[8]: как бы передать в шаблон NULL или INVALID_HANDLE_VALU
От: gid_vvp  
Дата: 29.08.06 10:47
Оценка:
_>>1. довольно странная идея использовать одну обёртку для хандлов вместе с другой
IS>Не вместе. Просто пример реализации.
Зачем этот пример?
Как неследует делать?

_>>2. ATL::CHandle не стоит использовать с хандлами файлов ибо CreateFile в случае ошибки возвращает ни что иное как INVALID_HANDLE_VALUE и следовательно невалидный хандл файла это INVALID_HANDLE_VALUE и ни что больше

IS>ATL::CHandle — это просто обёртка для HANDLE, чтобы автоматически закрывать хэндл при выходе из области видимости или при исключении.

ещё раз повторяю невалидный хандл файла это INVALID_HANDLE_VALUE и ни что больше
для други хандлов другие невалидные значения бывают.

смотри пример

ATL::CHandle h = CreateFile(....); // допустим что неудачно завершилась функция и h == INVALID_HANDLE_VALUE
и конечно в своём деструкторе он попытается закрыть хандл равный INVALID_HANDLE_VALUE

ни чего страшного не случится потому что внутри CloseHandle скорее всего есть проверка...
но неправильное использование налицо

или вот ещё замечательный пример иллюстрирующий убожество ATL::CHandle и мои слова о том что его лучше не использовать для хандлов файлов

ATL::CHandle h(CreateFile(....));// допустим что неудачно завершилась функция и h == INVALID_HANDLE_VALUE
if(h)
{
    // работаем с файлом... даже если он не открылся :))
}
else
{
    //обработка ошибок... только сюда мы никогда не попадём :)
}
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[5]: как бы передать в шаблон NULL или INVALID_HANDLE_VALU
От: Left2 Украина  
Дата: 29.08.06 11:34
Оценка:
Да, что-то типа такого. Ну кроме того что я бы наверное и typedef для HANDLE вынес в отдельного предка и от него бы всё наследовал.

А какими критериями ты определяешь что лучше а что нет? По количеству кода?
Я бы не стал экономить на количестве строк, благо такого кода у тебя всё равно не будет много — вариантов хэндлов с разными политиками пару десятков, не больше.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[6]: как бы передать в шаблон NULL или INVALID_HANDLE_VALU
От: gid_vvp  
Дата: 29.08.06 11:38
Оценка:
L>Да, что-то типа такого. Ну кроме того что я бы наверное и typedef для HANDLE вынес в отдельного предка и от него бы всё наследовал.

L>А какими критериями ты определяешь что лучше а что нет? По количеству кода?

L>Я бы не стал экономить на количестве строк, благо такого кода у тебя всё равно не будет много — вариантов хэндлов с разными политиками пару десятков, не больше.

По варазительности и простоте
Но конечно это субъективно...
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.