C++:在回调中恢复对象指针(API 不支持user_data指针)

C++: Recover object pointers in callbacks (no user_data pointer supported by API)

本文关键字:指针 不支持 API user data C++ 回调 恢复 对象      更新时间:2023-10-16

我正在使用一个 API,我需要在其中传递回调函数,但它不支持任何用户定义的参数来传递对象指针。

从静态/外部"C"回调函数中恢复对象有哪些选项?

我正在使用 SetAbortProc() ,它采用 HDC 并传递到AbortProc()回调。不幸的是,我看不到任何方法可以将进一步的数据与HDC相关联。

我能想到的解决方案:

  • 使用全局 Cls *my_abort_object
    应该工作,因为一次只能有一个打印作业处于活动状态。看起来有点草率,但也许这只是我?
  • 使用全局标准::映射<HDC,>
    对我来说可能没用,因为只有一个打印作业可以处于活动状态。全局指针解决方案更容易,在这种情况下没有缺点。
  • 使用封装整个中止操作
    的单例可能是最明智的方法,无需太多工作。
  • 使用 ATL 风格的投篮
    (这基本上是运行时生成的代码,它调用real_callback(HARDCODED_OBJ_PTR, cb_arg1, cb_arg2, ...);作为回调函数传入的代码)。
    会非常好,但很难自己做,数据执行预防等问题。框架可以做一些你无法轻易模仿的事情。

我目前倾向于单例解决方案,因为它似乎是最干净的,没有太多开销。我将不胜感激任何建议!

额外信息: C++ Win32 编程使用 MSVC Espress 2010

如果你想要一个稍微健壮的解决方案,我会继续使用一个命名空间级 API,它包装了一个单例式的map HDC -> class* 关系。那么,如果您需要在多个 HDC 环境中使用该功能,那就太好了。我想公共 API 会与 SetAbortProc() 非常相似,但它也会为每个 HDC 创建和映射相应的处理程序对象。

紧随其后的是,由于您只需要一个 HDC,因此只需使用全局指针(具有某种断言/恒常性,因此它不会变异),并在您获得中止回调时依赖该指针

的设置。

让我感到惊讶,因为Microsoft IME非常擅长提供用户数据参数。但是,如果做不到这一点,最佳解决方案是使用 LLVM。他们为您提供简单易用的功能来JIT大放

异彩。

看到带有回调的 API 不允许始终限制其他用户的用户数据,这很可悲。不过,如果涉及到单例类型,我个人会倾向于使用单例类型。

不过,您可能应该将此报告给 API 的开发人员。您还可以发现,如果您可以从回调中的 API 访问对象,有时您可以将指针/数据戳入其架构的其他部分,在我看来,向开发人员寻求帮助是最好的选择。你甚至可以在帮助自己的同时帮助他们。