CreateToolhelp32Snapshot

CreateToolhelp32Snapshot

TL; DR

假设我实现了一个类,该类实现了返回HANDLE的API。
假设我的班级是HANDLE的所有者,并负责创建,更新和关闭它。

如何防止API的调用者关闭句柄并破坏设计?

背景

CreateToolhelp32Snapshot是一个昂贵的调用,必须明智地使用。
我的解决方案中有很多项目,每个项目都粗心地调用CreateToolhelp32Snapshot

我想实现一个包装类,该类提供对CreateToolhelp32Snapshot的“智能”访问。

我的课程将是HADNLE返回的CreateToolhelp32Snapshot的所有者,并将在需要时进行更新(重新调用CreateToolhelp32Snapshot)(尚未完全定义何时需要)。

为了简单起见,我们假设我的应用程序是单个进程和线程,而我的类只有一个实例。

最佳答案

假设我实现了一个类,该类实现了返回HANDLE的API


您通过返回手柄破坏了设计。包装器的用户不需要关心句柄,而可以关心他们想要的数据,例如您的案例中的模块列表。公开可以将此类数据返回给用户的API。

class snapshot
{
    public:
    snapshot()
    {
        m_handle = CreateToolhelp32Snapshot(...);
    }
    ~snapshot()
    {
        CloseHandle(m_handle);
    }
    getModules()
    {
        // use m_handle to return a list of modules.
    }
    private:
    HANDLE m_handle;
};

08-25 08:34