Microsoft 信息保护 SDK - 策略 SDK 管理器

策略 SDK 包含一个观察者类。 观察者成员是虚拟成员,应被重写以处理异步操作回调。

异步操作完成后,将 OnXxx() 调用与结果对应的成员函数。 示例包括 OnLoadSuccess()OnLoadFailure() 、 和 OnAddEngineSuccess()mip::Profile::Observer

以下示例演示 promise/future 模式,该模式也由 SDK 示例使用,可以扩展该模式来实现所需的回调行为。

配置文件观察器实现

在下面的示例中,我们创建了一个 ProfileObserver 派生自 的类 mip::Profile::Observer 。 成员函数已被重写,以使用整个示例中使用的 future/promise 模式。

注意:以下示例仅部分实现,不包括相关观察 项的重写。

profile_observer.h

在 标头中,我们 ProfileObserver 定义 派生自 mip::Profile::Observer ,然后重写每个成员函数。

class ProfileObserver final : public mip::Profile::Observer {
public:
ProfileObserver() { }
  void OnLoadSuccess(const std::shared_ptr<mip::Profile>& profile, const std::shared_ptr<void>& context) override;
  void OnLoadFailure(const std::exception_ptr& error, const std::shared_ptr<void>& context) override;
  //TODO: Implement remaining members
};

profile_observer.cpp

在实现本身中,我们定义要为每个观察成员函数执行的操作。

每个成员接受两个参数。 第一个是指向 由 函数处理的 类的共享指针。 ProfileObserver::OnLoadSuccess 预期会收到 mip::ProfileProfileObserver::OnAddEngineSuccess 将预期 mip::ProfileEngine

第二个是指向上下文 的共享 指针。 在我们的实现中,上下文是对 的引用 std::promise ,作为 传入 shared_ptr<void> 。 函数的第一行将此方法强制转换到 std::promise ,然后存储在名为 的 对象中 promise

最后,通过设置 并传递 对象 promise->set_value() ,为将来 mip::Profile 做好准备。

#include "profile_observer.h"
#include <future>

//Called when Profile is successfully loaded
void ProfileObserver::OnLoadSuccess(const std::shared_ptr<mip::Profile>& profile, const std::shared_ptr<void>& context) {
  //cast context to promise
  auto promise = std::static_pointer_cast<std::promise<std::shared_ptr<mip::Profile>>>(context);
  //set promise value to profile
  promise->set_value(profile);
}

//Called when Profile fails to load
void ProfileObserver::OnLoadFailure(const std::exception_ptr& error, const std::shared_ptr<void>& context) {
  auto promise = std::static_pointer_cast<std::promise<std::shared_ptr<mip::Profile>>>(context);
  promise->set_exception(error);
}

//TODO: Implement remaining observer members

执行任何异步操作时,观察程序实现将传递到设置构造函数或异步函数本身。