C++ C++;:恢复回调中的对象指针(API不支持用户\数据指针)

C++ C++;:恢复回调中的对象指针(API不支持用户\数据指针),c++,winapi,callback,C++,Winapi,Callback,我使用的API需要传入回调函数,但它不支持任何用户定义的参数来传递对象指针 从静态/外部“C”回调函数恢复对象的选项有哪些 我正在使用,它接受一个HDC并传递到AbortProc()回调。不幸的是,我看不到任何方法将进一步的数据与HDC关联起来 我能想到的解决办法是: 使用全局Cls*我的中止对象 应该可以工作,因为一次只能有一个打印作业处于活动状态。看起来有点邋遢,但也许那只是我 使用全局std::map 可能对我没用,因为只有一个打印作业可以激活。全局指针解决方案更简单,在这种情况下没有缺

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

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

我正在使用,它接受一个HDC并传递到
AbortProc()
回调。不幸的是,我看不到任何方法将进一步的数据与HDC关联起来

我能想到的解决办法是:

  • 使用全局Cls*我的中止对象
    应该可以工作,因为一次只能有一个打印作业处于活动状态。看起来有点邋遢,但也许那只是我
  • 使用全局std::map
    可能对我没用,因为只有一个打印作业可以激活。全局指针解决方案更简单,在这种情况下没有缺点
  • 使用一个封装整个中止事件的单例
    可能是最明智的方法,不用做太多工作
  • 使用ATL样式的thunks
    (这基本上是运行时生成的代码,调用
    real\u回调(硬编码的\u OBJ\u PTR、cb\u arg1、cb\u arg2等);
    作为回调函数传入的代码)。
    这将非常好,但很难单独完成,数据执行预防等方面存在问题。框架可以完成一些您无法轻松模仿的事情
我目前倾向于单例解决方案,因为它看起来是最干净的,没有太多开销。如果有任何建议,我将不胜感激


ExtFinels:C++使用Win32编程,使用MSVC ESPECH 2010

< P>很遗憾看到API的回调不允许用户数据总是限制其他用户。我个人会倾向于使用单例类型,如果真的要这样做的话


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

如果您想要一个稍微健壮的解决方案,我会继续使用命名空间级API,它封装了
HDC
->
类*
关系的单例
映射。如果您需要在多个HDC上下文中使用该功能,那么您就可以使用它了。我可以想象公共API将非常类似于
SetAbortProc()
,但它也会根据HDC创建和映射相应的处理程序对象


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

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

-1因为这里根本不需要单身人士。否决票是不公平的,他征求了意见,OP显然表示他知道还有其他选择。