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

时间:2013-01-23 16:46:22

标签: c++ winapi callback

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

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

我正在使用SetAbortProc(),它接受​​HDC并传递给AbortProc()回调。不幸的是,我认为没有办法将更多数据与HDC联系起来。

我能想到的解决方案:

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

我目前倾向于单身人士解决方案,因为它看起来最干净而没有太多的开销。我很感激任何建议!

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

2 个答案:

答案 0 :(得分:1)

如果你想要一个稍微强大的解决方案,我会继续寻找一个命名空间级别的API,它包含一个单独的map HDC - > class*关系。如果你需要多个HDC环境中的功能,那么你会很高兴。我认为公共API与SetAbortProc()非常相似,但它也会为每个HDC创建并映射相应的处理程序对象。

因为你只需要一个HDC,所以只需要使用一个全局指针(带有某种断言/常量,这样它就不会发生变异),并依赖于你获得中止回调时的设置。

答案 1 :(得分:-1)

有悲伤地看到的API与回调不允许用于用户数据,该数据总是限制到其他用户。如果遇到它,我会亲自动摇使用单件类型。

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