代码之家  ›  专栏  ›  技术社区  ›  idanshmu

如何确保和强制拥有一个句柄以防止不需要的closehandle调用?

  •  0
  • idanshmu  · 技术社区  · 6 年前

    DR

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

    如何防止api的调用方关闭我的句柄并破坏我的设计?

    背景

    CreateToolhelp32Snapshot 是一个昂贵的电话,必须明智地使用。 我的解决方案中有许多项目,每个项目都调用 创建工具帮助32快照 无忧无虑地。

    我想实现一个包装类,它提供对 创建工具帮助32快照 .

    我的班级将拥有 HADNLE 返回者 创建工具帮助32快照 并将更新它(重新调用 创建工具帮助32快照 )需要时(还没有完全定义何时需要)。

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

    4 回复  |  直到 6 年前
        1
  •  4
  •   Gaurav Sehgal    6 年前

    假设我实现了一个类,它实现了一个返回句柄的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;
    };
    
        2
  •  1
  •   SoronelHaetir    6 年前

    你能做的就是使用duplicatehandle和 要求 打电话的人叫closehandle。除此之外,你必须信任打电话的人。

        3
  •  0
  •   Nicol Bolas    6 年前

    你不能。只要你不愿意完全封装 HANDLE ,可以访问 把手 可以直接关闭。这和能够做到 delete smart_ptr.get(); .

    C++可以保护您免受意外误用。它不能保护你 背信弃义 . 如果使用smart handle类的用户没有得到smart handle类是 把手 ,你无能为力。

        4
  •  0
  •   Ajay    6 年前

    如果我要实现那个类,我只需编写方法 Enumerate 会打电话来 CreateToolhelp32Snapshot ,另一组函数,然后 CloseHandle . 这个 HANDLE 不会成为类本身的一部分,而是本地的 列举 方法。 枚举将填充所需的结构(用户定义的),并将创建 vector 属于那个结构(或( unordered_ ) map ,如果需要某些PID->进程信息访问)。 该类将促进方法来获取 列举的 数据。对于一个一流的C++类,我实际上会实现 begin end 方法,以便类/对象可以与基于范围的 for 循环。

    为什么你真的需要 延迟 在实际处理中 创建工具帮助32快照 ?当一个真正的来电者 安全的 win32 api在那个句柄上,运行进程的状态就会改变。如果类的对象停留很长时间(er),那么您所得到的只是该句柄的陈旧/不一致的信息。