RAII для хендлов WinAPI
От: Ignoramus  
Дата: 26.10.05 06:21
Оценка:
Прежде чем создавать велосипед, решил удостовериться, что этого еще не было.

Идея проста — подобно std::auto_ptr и boost::scoped_ptr и пр. сделать смарт-пойнтер, который следил бы за освобождением некоторого ресурса операционной системы. Т.е. правильно было бы его назвать смарт-хендл .

В boost ничего похожего не нашел..

Буду признателен за совет.
Re: RAII для хендлов WinAPI
От: sch  
Дата: 26.10.05 06:26
Оценка:
Здравствуйте, Ignoramus, Вы писали:

I>Прежде чем создавать велосипед, решил удостовериться, что этого еще не было.


I>Идея проста — подобно std::auto_ptr и boost::scoped_ptr и пр. сделать смарт-пойнтер, который следил бы за освобождением некоторого ресурса операционной системы. Т.е. правильно было бы его назвать смарт-хендл .


http://www.codeproject.com/cpp/AutoClose.asp
Re: RAII для хендлов WinAPI
От: PoM-PoM 40mm Россия  
Дата: 26.10.05 06:27
Оценка:
Здравствуйте, Ignoramus, Вы писали:

I>Прежде чем создавать велосипед, решил удостовериться, что этого еще не было.


I>Идея проста — подобно std::auto_ptr и boost::scoped_ptr и пр. сделать смарт-пойнтер, который следил бы за освобождением некоторого ресурса операционной системы. Т.е. правильно было бы его назвать смарт-хендл .


I>В boost ничего похожего не нашел..


I>Буду признателен за совет.


можно boost::shraed_ptr использовать для HANDLE. раньше это описывалось в доках к бусту.
Will give me piece of mind
Re[2]: RAII для хендлов WinAPI
От: PoM-PoM 40mm Россия  
Дата: 26.10.05 06:31
Оценка:
Здравствуйте, PoM-PoM 40mm, Вы писали:

PP4>Здравствуйте, Ignoramus, Вы писали:


I>>Прежде чем создавать велосипед, решил удостовериться, что этого еще не было.


I>>Идея проста — подобно std::auto_ptr и boost::scoped_ptr и пр. сделать смарт-пойнтер, который следил бы за освобождением некоторого ресурса операционной системы. Т.е. правильно было бы его назвать смарт-хендл .


I>>В boost ничего похожего не нашел..


I>>Буду признателен за совет.


PP4>можно boost::shraed_ptr использовать для HANDLE. раньше это описывалось в доках к бусту.

примерно так

typedef shared_ptr<void> handle;

handle createProcess()
{
    shared_ptr<void> pv(CreateProcess(), CloseHandle);
    return pv;
}
Will give me piece of mind
Re[3]: RAII для хендлов WinAPI
От: Ignoramus  
Дата: 26.10.05 07:01
Оценка:
Здравствуйте, PoM-PoM 40mm, Вы писали:

PP4>Здравствуйте, PoM-PoM 40mm, Вы писали:


PP4>>Здравствуйте, Ignoramus, Вы писали:


I>>>Прежде чем создавать велосипед, решил удостовериться, что этого еще не было.


I>>>Идея проста — подобно std::auto_ptr и boost::scoped_ptr и пр. сделать смарт-пойнтер, который следил бы за освобождением некоторого ресурса операционной системы. Т.е. правильно было бы его назвать смарт-хендл .


I>>>В boost ничего похожего не нашел..


I>>>Буду признателен за совет.


PP4>>можно boost::shraed_ptr использовать для HANDLE. раньше это описывалось в доках к бусту.

PP4>примерно так

PP4>
PP4>typedef shared_ptr<void> handle;

PP4>handle createProcess()
PP4>{
PP4>    shared_ptr<void> pv(CreateProcess(), CloseHandle);
PP4>    return pv;
PP4>}


PP4>


Буст это уже интересно, только имхо у тебя немного не точно...

Вижу шаблонный конструктор с двумя параметрами

template<class Y, class D> shared_ptr(Y * p, D d);


как его вызывать для HICON, DestroyIcon ?
Re: RAII для хендлов WinAPI
От: z00n  
Дата: 26.10.05 07:32
Оценка: 6 (1)
Здравствуйте, Ignoramus, Вы писали:

I>Прежде чем создавать велосипед, решил удостовериться, что этого еще не было.


I>Идея проста — подобно std::auto_ptr и boost::scoped_ptr и пр. сделать смарт-пойнтер, который следил бы за освобождением некоторого ресурса операционной системы. Т.е. правильно было бы его назвать смарт-хендл .


Реализацию Win32 RAII можно посмотреть у John Torjo, в его Win32 GUI Generics library
http://www.torjo.com
Я сам не очень внимательно смотрел, но она boost-based.
Re: RAII для хендлов WinAPI
От: Mr. None Россия http://mrnone.blogspot.com
Дата: 26.10.05 07:38
Оценка:
Здравствуйте, Ignoramus, Вы писали:

I>Прежде чем создавать велосипед, решил удостовериться, что этого еще не было.


I>Идея проста — подобно std::auto_ptr и boost::scoped_ptr и пр. сделать смарт-пойнтер, который следил бы за освобождением некоторого ресурса операционной системы. Т.е. правильно было бы его назвать смарт-хендл .


I>В boost ничего похожего не нашел..


I>Буду признателен за совет.


Вот мой велосипед:
namespace HelpUtils
{
    // Default handle strategy
    class DefaultHandle
    {
    protected:
        void close(HANDLE handle)
        {
            ::CloseHandle(handle);
        }
    };

    // Strategy for sockets
    class SocketHandle
    {
    protected:
        void close(SOCKET sock)
        {
            closesocket(sock);
        }

        HANDLE get_as(SOCKET sock, HANDLE) const
        {
            return reinterpret_cast<HANDLE>(sock);
        }
    };

    // auto pointer for handles
    // HandleT - type of the handle (for example HANDLE or SOCKET);
    // InvalidValueConst - invalid value constant (for example INVALID_SOCKET)
    // HandleStrategyT - specific strategy for the this handle type,
    //                   must implement so operation as handle close,
    //                   can implement get_as operation for handle converting.
    template<typename HandleT, HandleT InvalidValueConst, class HandleStrategyT = DefaultHandle>
    class auto_handle : public HandleStrategyT
    {
    public:
        typedef HandleT handle_type;
        typedef auto_handle<HandleT, InvalidValueConst, HandleStrategyT> auto_handle_type;
        
        explicit auto_handle(HandleT h = InvalidValueConst) throw()
                : owns(h != InvalidValueConst), handle(h) {}

        auto_handle(const auto_handle_type& left) throw()
                : owns(left.owns), handle(left.release()) {}

        auto_handle_type& operator=(const auto_handle_type& left) throw()
        {
            if(this != &left)
            {
                if(handle != left.get())
                {
                    if(owns)
                    {
                        close();
                    }
                    owns = left.owns;
                }
                else if(left.owns)
                {
                    owns = true;
                }
                handle = left.release();
            }
            
            return (*this);
        }

        ~auto_handle()
        {
            if(owns)
            {
                close();
            }
        }

        // Get handle
        handle_type get() const throw(){ return handle; }

        // Release handle (not close!)
        handle_type release() const throw()
        {
            owns = false;
            return handle;
        }

        // Convert handle from type HandleT to type Type.
        // For using this function handle strategy must implement function get_as:
        // Type get_as(HandleT, Type)
        template<typename Type>
        Type get_as(Type tp) const
        {
            return HandleStrategyT::get_as(handle, tp);
        }

        // Check is handle valid
        bool is_valid() const { return handle != InvalidValueConst; }

        // Close handle.
        // Handle strategy must implement function close for real handle closing:
        // void close(HandleT)
        void close()
        {
            if(is_valid())
            {
                HandleStrategyT::close(handle);
                handle = InvalidValueConst;
            }
        }

        // Reset handle. Close current and set new.
        void reset(HandleT h)
        {
            close();
            handle = h;
        }

    private:
        mutable bool owns;
        HandleT handle;
    };

    // Typedef for standart handle.
    typedef auto_handle<HANDLE, 0> StdHandle;
    // Typedef for sockets.
    typedef auto_handle<SOCKET, INVALID_SOCKET, SocketHandle> SocketWrap;
}


Использование интуитивно понятно, я думаю .
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
Re: RAII для хендлов WinAPI
От: srggal Украина  
Дата: 26.10.05 13:11
Оценка:
Здравствуйте, Ignoramus, Вы писали:

I>Прежде чем создавать велосипед, решил удостовериться, что этого еще не было.


I>Идея проста — подобно std::auto_ptr и boost::scoped_ptr и пр. сделать смарт-пойнтер, который следил бы за освобождением некоторого ресурса операционной системы. Т.е. правильно было бы его назвать смарт-хендл .


I>В boost ничего похожего не нашел..


I>Буду признателен за совет.


Кое-что обсуждалось здесь
Автор: SergASh
Дата: 12.10.05
... << RSDN@Home 1.1.4 stable rev. 510>>
Re: RAII для хендлов WinAPI
От: Глеб Алексеев  
Дата: 27.10.05 07:29
Оценка:
Здравствуйте, Ignoramus, Вы писали:

I>Идея проста — подобно std::auto_ptr и boost::scoped_ptr и пр. сделать смарт-пойнтер, который следил бы за освобождением некоторого ресурса операционной системы. Т.е. правильно было бы его назвать смарт-хендл .

Вдобавок ко всему сказанному — в WTL классы а-ля CWindow, CBitmap, etc прибивают хэндлы.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.