CHandle критика
От: Аноним  
Дата: 17.08.07 17:35
Оценка:
Выкладываю свой класс для критики

CHandle.h
#pragma once
#include "windows.h"
#include "template.h"

class CHandle {
public:
    OPERATORS;
    CHandle():m_handle(NULL){};
    CHandle(HANDLE handle){
        m_handle = handle;
    }
    ~CHandle(){
        Close();
    }
    void Close();
    bool IsValid() const{
        return (( NULL != _m_handle )&&( INVALID_HANDLE_VALUE != _m_handle ));
    };

    bool Attach(HANDLE h);
    HANDLE Detach();

    HANDLE operator =(HANDLE handle){
        Attach(handle);
        return handle;
    }
    bool operator =(const CHandle& handle);

    bool operator!() const{
        return !IsValid();
    };

    operator HANDLE() const{
        return _m_handle;
    };


    static bool Duplicate(
        HANDLE hSourceProcessHandle,
        HANDLE hSourceHandle,
        HANDLE hTargetProcessHandle,
        LPHANDLE lpTargetHandle,
        DWORD dwDesiredAccess,
        BOOL bInheritHandle,
        DWORD dwOptions
        )
    {
        BOOL result = ::DuplicateHandle(hSourceProcessHandle,hSourceHandle,
            hTargetProcessHandle,lpTargetHandle,
            dwDesiredAccess,bInheritHandle,dwOptions
            );
        return ::FromBOOL(result);
    };
    static bool Duplicate(
        HANDLE hSourceProcessHandle,
        HANDLE hSourceHandle,
        HANDLE hTargetProcessHandle,
        LPHANDLE lpTargetHandle,
        BOOL bInheritHandle = false
        )
    {
        return Duplicate(hSourceProcessHandle,hSourceHandle,hTargetProcessHandle,lpTargetHandle,
            DUPLICATE_SAME_ACCESS,bInheritHandle,DUPLICATE_SAME_ACCESS);
    };

    bool Duplicate(HANDLE hTargetProcessHandle,LPHANDLE lpTargetHandle,
        DWORD dwDesiredAccess,bool bInheritHandle,DWORD dwOptions) const;
    bool Duplicate(HANDLE hTargetProcessHandle,LPHANDLE lpTargetHandle,bool bInheritHandle = false) const;
    bool DuplicateFrom(HANDLE hSrcProcess,HANDLE hSrcHandle,
        DWORD dwDesiredAccess = DUPLICATE_SAME_ACCESS,
        bool bInheritHandle = false,
        DWORD dwOptions = DUPLICATE_SAME_ACCESS);

    DWORD Wait(DWORD timeout) const{
        return WaitForSingleObject(_m_handle,timeout);
    }

    DWORD WaitInfinite() const;

    static DWORD WaitForMultipleObjects(IN DWORD nCount,IN CONST CHandle* lpHandles,
        IN BOOL bWaitAll, IN DWORD dwMilliseconds)
    {
        return ::WaitForMultipleObjects(nCount,(HANDLE*)lpHandles,bWaitAll,dwMilliseconds);
    }

    HANDLE Handle(){
        return _m_handle;
    }

    //__declspec(property(get=get_Handle,put=put_Handle)) HANDLE __Handle;
    //HANDLE get_Handle(){
    //    return m_handle;
    //};
    //void put_Handle(HANDLE handle){
    //    Attach(handle);
    //};
private:
    __declspec(property(get=get_m_handle,put=put_m_handle)) HANDLE _m_handle;
    HANDLE get_m_handle() const {
        return m_handle;
    };
    void put_m_handle(HANDLE handle){
#if F_LIB_TEST
        if ( m_handle != handle ){
            dpf(("handle changed: %lx -> %lx",m_handle,handle));
        }
#endif
        m_handle = handle;
    };


    HANDLE m_handle;
};




#include "stdafx.h"
#include "CHandle.h"

void CHandle::Close()
{
    __mytry;
    if ( IsValid() ){
        CloseHandle(_m_handle);
        _m_handle = NULL;
    }
    __myexcept_void;
}

bool CHandle::Attach(HANDLE h)
{
    Close();
    _m_handle = h;
    return IsValid();
}

HANDLE CHandle::Detach(){
    HANDLE h = _m_handle;
    _m_handle = NULL;
    return h;
}

bool CHandle::operator =(const CHandle& handle)
{
    Close();
    handle.Duplicate(GetCurrentProcess(),&m_handle);
    return IsValid();
}

DWORD CHandle::WaitInfinite() const
{
    __mytry;
    return Wait(INFINITE);
    __myexcept(WAIT_FAILED);
}

bool CHandle::Duplicate(HANDLE hTargetProcessHandle,LPHANDLE lpTargetHandle,
                     DWORD dwDesiredAccess,bool bInheritHandle,DWORD dwOptions) const
{
    __mytry;
    BOOL result = Duplicate(GetCurrentProcess(),_m_handle,hTargetProcessHandle,lpTargetHandle,
        dwDesiredAccess,bInheritHandle,dwOptions);
    return FromBOOL(result);
    __myexcept(false);
}

bool CHandle::Duplicate(HANDLE hTargetProcessHandle,LPHANDLE lpTargetHandle,bool bInheritHandle) const
{
    __mytry;
    return Duplicate(hTargetProcessHandle,lpTargetHandle,
        DUPLICATE_SAME_ACCESS,bInheritHandle,DUPLICATE_SAME_ACCESS);
    __myexcept(false);
}

bool CHandle::DuplicateFrom(HANDLE hSrcProcess,HANDLE hSrcHandle,
                   DWORD dwDesiredAccess,bool bInheritHandle,DWORD dwOptions)
{
    __mytry;
    Close();
    return Duplicate(hSrcProcess,hSrcHandle,GetCurrentProcess(),&m_handle,dwDesiredAccess,bInheritHandle,dwOptions);
    __myexcept(false);
};



Какая политика с вашей точки зрения более правильная?

1.
HANDLE hProcess;
CHandle handle = hProcess;
handle = hThread; //генерируется исключение, что бы избегать таких ситуаций. Как бы одна перемення — один ресурс и хранить в ней разные — не красиво как-то

2.
HANDLE hThread;
CHandle h = hProcess;
h = hThread; //h.Close(); h.handle = hThread закрывается текущий хендл и присваевается новое значение

====================================================
CHandle h1,h2;
h1 = h2;

что должно выполняться в этом случае DuplicateHandle или (h1.Close();h1.handle = h2.handle;h2.handle = NULL)????
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.