2301_80219866 2024-10-07 20:48 采纳率: 60%
浏览 5

如何向回调函数中传指针

img


如图,hR是一个网络指针,我要传入钩子函数中用于其他操作,但是尝试过用全局变量,并不好使,请问佬们有什么方法嘛,hR前面有些前置代码为方便查看已经p掉了

  • 写回答

1条回答 默认 最新

  • 一轮明月照丘壑 2024-10-07 20:49
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    从你的描述来看,你想要将 HINTERNET hR 这个指针传递到钩子处理函数 KeyboardProc 中。在 C++ 中,向回调函数传递参数的一个常见方式是使用全局变量或外部变量,但这并不是最佳实践,因为它可能导致代码难以管理和维护。下面有一些更安全和可靠的方法可以实现你的需求:

    方法一:使用结构体或类

    你可以创建一个结构体或类来存储 HINTERNET 指针以及其他可能需要的数据。然后将这个结构体或类的实例作为全局变量或者传递给其他函数。钩子处理函数可以通过这个结构体或类访问 HINTERNET 指针。

    例如:

    struct MyData {
        HINTERNET hR;
        // 可以添加其他需要的成员变量
    };
    
    MyData globalData; // 全局变量实例,或者通过其他方式传递给你的钩子处理函数
    
    // 钩子处理函数中使用全局数据实例的 hR 指针
    LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) {
        if (globalData.hR != nullptr) {
            // 使用 globalData.hR 进行操作
        }
        // 其他处理逻辑...
    }
    

    方法二:使用线程本地存储(TLS)

    如果你的程序是多线程的,你可以使用线程本地存储(Thread Local Storage, TLS)为每个线程存储一个特定的数据副本。这样每个线程都有自己的数据副本,不会影响其他线程。这也适用于回调函数中需要传递数据的情况。这种方法可以确保数据的隔离性和安全性。不过这需要更深入的了解多线程编程和TLS的使用。

    方法三:通过回调函数参数传递数据(如果可行)

    如果钩子处理函数的 lParam 参数可以用来传递数据(取决于你的钩子类型和设置方式),那么你可以将 HINTERNET hR 作为这个参数的一部分来传递。但是请注意,这种方法的可行性取决于具体的钩子类型和系统的API实现。如果你不确定怎么做,可能需要查阅相关文档或示例代码。

    总结建议:

    • 使用结构体或类来存储数据是一种简单且常见的方法。它适用于大多数情况,并且易于理解和维护。
    • 如果你的程序是多线程的,考虑使用线程本地存储(TLS)。但请注意TLS的使用需要谨慎,确保正确地管理数据副本的生命周期和同步问题。
    • 如果钩子处理函数的参数允许传递数据,可以考虑通过参数传递数据。但需要确保不会违反系统的API使用规则或引入竞态条件等问题。总之,根据具体情况选择合适的方法,并尽量避免使用全局变量来传递数据,因为这可能导致代码难以管理和维护。
    评论

报告相同问题?

问题事件

  • 修改了问题 10月7日
  • 创建了问题 10月7日

悬赏问题

  • ¥20 ARKts悬浮窗和快捷方式问题
  • ¥15 comparecluster没有办法kegg
  • ¥15 远程访问linux主机超时
  • ¥15 odoo17存货管理优势于中国国内该行业传统ERP或MES的详细解读和举例
  • ¥15 CPU卡指令整合指令数据都在图片上
  • ¥15 odoo17处理受托加工产品
  • ¥15 如何用MATLAB编码图三的积分
  • ¥15 圆孔衍射光强随孔径变化
  • ¥15 MacBook pro m3max上用vscode运行c语言没有反应
  • ¥15 ESP-PROG配置错误,ALL ONES