返回首页

简介
下面是一个位更加灵活和舒适的选择到ATL:CHandle类。这个类是模板,以支持不同的处理零值(如INVALID_HANDLE_VALUE和NULL)。下面是源代码:

///////////////////////////////////////////////////////////////////////////////



// CAtomT - ATOM type wrapper





template<HANDLE t_hNullValue>

class CHandleT

{

public:

    HANDLE m_hHandle;



public:

    CHandleT() : m_hHandle(t_hNullValue)

    { }



    CHandleT(const CHandleT& Handle) :

        m_hHandle(Handle.Duplicate(::GetCurrentProcess(), 

                  DUPLICATE_SAME_ACCESS, FALSE, DUPLICATE_SAME_ACCESS))

    { }

    

    explicit CHandleT(HANDLE Handle) :

        m_hHandle(Handle)

    { }



     CHandleT()

    {

        if (IsValid())

        {

            Close();

        }

    }



    CHandleT& operator=(const CHandleT& Handle)

    {

        if (this != &Handle)

        {

            Close();

            m_hHandle = Handle.Duplicate(::GetCurrentProcess(), 

                        DUPLICATE_SAME_ACCESS, FALSE, DUPLICATE_SAME_ACCESS);

        }



        return (*this);

    }



    operator HANDLE() const

    {

        return m_hHandle;

    }



public:

    bool IsValid() const

    {

        return (m_hHandle != t_hNullValue);

    }



    void Attach(HANDLE Handle)

    {

        ATLASSERT(!IsValid());

        m_hHandle = Handle;

    }



    HANDLE Detach()

    {

        HANDLE Handle = m_hHandle;

        m_hHandle = t_hNullValue;

        return Handle;

    }



    void Close()

    {

        if (IsValid())

        {

            ATLVERIFY(::CloseHandle(m_hHandle) != FALSE);

            m_hHandle = t_hNullValue;

        }

    }



#if (_WIN32_WINNT >= 0x0400)

    DWORD GetInformation() const

    {

        ATLASSERT(IsValid());

        DWORD dwHandleInfo = 0;

        ATLVERIFY(::GetHandleInformation(m_hHandle, &dwHandleInfo) != FALSE);

        return dwHandleInfo;

    }



    bool IsFlagInherit() const

    {

        return (GetInformation() & HANDLE_FLAG_INHERIT) != 0;

    }



    bool IsFlagProtectFromClose() const

    {

        return (GetInformation() & HANDLE_FLAG_PROTECT_FROM_CLOSE) != 0;

    }



    void SetInformation(DWORD dwMask, DWORD dwFlags)

    {

        ATLASSERT(IsValid());

        ATLVERIFY(::SetHandleInformation(m_hHandle, dwMask, dwFlags) != FALSE);

    }



    void SetFlagInherit(bool bFlagInherit)

    {

        SetInformation(HANDLE_FLAG_INHERIT, (bFlagInherit) ? HANDLE_FLAG_INHERIT : 0);

    }



    void SetFlagProtectFromClose(bool bFlagProtectFromClose)

    {

        SetInformation(HANDLE_FLAG_PROTECT_FROM_CLOSE, 

          (bFlagProtectFromClose) ? HANDLE_FLAG_PROTECT_FROM_CLOSE : 0);

    }

#endif // (_WIN32_WINNT >= 0x0400)





    HANDLE Duplicate(HANDLE hTargetProcess, DWORD dwDesiredAccess, 

                     BOOL bInheritHandle = FALSE, DWORD dwOptions = 0) const

    {

        HANDLE hNewHandle = t_hNullValue;

		if (IsValid())

		{

			ATLVERIFY(::DuplicateHandle(::GetCurrentProcess(), m_hHandle, 

			          hTargetProcess, &hNewHandle, dwDesiredAccess, 

			          bInheritHandle, dwOptions) != FALSE);

		}

        return hNewHandle;

   }

};



typedef CHandleT<NULL> CHandle;

typedef CHandleT<INVALID_HANDLE_VALUE> CFileHandle;

回答

评论会员:戴夫朗兹 时间:2011/12/07
我使用的收集你的CFileHandle类在一个std:矢量,并发现了几个我需要做出的改变:

在连接方法,我倒断言:

{C}
... ...因为它似乎是南辕北辙"。

2。在重复的方法,以迎合复制无效的句柄值,我改变了代码:

... ...否则,它宣称在复制发生在一个非空的向量初始化,这些副本(如果我忽略断言),导致有效的重复处理,而不是重复无效的句柄值, - 这似乎更适合我。
评论会员:isemenov 时间:2011/12/07
谢谢您的评论!您的改变是正确的,我有更新的文章和源文件并将其发送到编辑
评论会员:。 时间:2011/12/07