C++:在回调中恢复对象指针(API 不支持user_data指针)
C++: Recover object pointers in callbacks (no user_data pointer supported by API)
我正在使用一个 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 访问对象,有时您可以将指针/数据戳入其架构的其他部分,在我看来,向开发人员寻求帮助是最好的选择。你甚至可以在帮助自己的同时帮助他们。
- 为什么istream不支持右值提取
- 为什么指针不写入类的地址?
- 错误:(-210:不支持的格式或格式组合)功能'create'中的硬件视频解码器不支持视频源
- Casablanca/cpprestsdk listener.support接受函数,但不支持方法
- 为什么C++不支持对未初始化变量进行智能分析?
- 为什么"具有常量成员的结构"类型的指针不能指向"具有非常量成员的结构"?
- 在 c++ 中连接字符串和整数,以便在 C++ 11 不支持计算机的情况下读取多个文件
- 当目标指针不是基类的类型时,为什么允许dynamic_cast为多态类生成 null 指针?
- 在 Ubuntu 18.04 上编译 GLSL 着色器时"不支持 GLSL 3.30"?
- 为什么联机C++ IDE 不支持"graphics.h"头文件?
- Clang编译器不支持aarch64-apple-darwin上的-fxray-instrument
- 为什么我的 clang 格式不支持 PPDirectiveIndentStyle 选项?
- 比较两个 constexpr 指针不是 constexpr?
- 为什么C 模板功能不支持返回指针
- 在 c++ 中,条件运算符不支持指针
- 函数指针是否不支持C++中的实例类型
- 不支持在c或c++中添加两个指针.为什么?
- Cereal不支持原始指针
- 智能指针,当c++ 11不支持时,它不会转移所有权,也不会被共享
- C++:在回调中恢复对象指针(API 不支持user_data指针)