x64dbg 插件开发指南:GuiCloseQWidgetTab 关闭插件 QWidget 标签页
x64dbg 插件开发指南GuiCloseQWidgetTab 关闭插件 QWidget 标签页【免费下载链接】x64dbgAn open-source user mode debugger for Windows. Optimized for reverse engineering and malware analysis.项目地址: https://gitcode.com/gh_mirrors/x6/x64dbg导读GuiCloseQWidgetTab是 x64dbg 为插件开发者提供的 GUI 桥接函数之一用于关闭插件通过GuiAddQWidgetTab添加到主界面标签栏QTabWidget中的 Qt QWidget 标签页。本文以 GuiCloseQWidgetTab.md 为骨架结合 x64dbg 仓库中 bridge 层、GUI 层的真实实现讲解该函数的签名、调用链、与GuiAddQWidgetTab/GuiShowQWidgetTab的配合方式以及插件中正确关闭自定义标签页的完整实战方案。函数签名与作用GuiCloseQWidgetTab属于 x64dbg 插件开发 API 中的 GUI 函数族完整清单见 gui/index.rst其唯一职责是关闭一个由插件添加的 Qt QWidget 标签页。void GuiCloseQWidgetTab(QWidget* qWidget);该函数在 bridgemain.h 中声明供插件链接x64dbg_bridge后直接调用。参数说明参数类型说明qWidgetQWidget*待关闭标签页对应的 Qt QWidget 对象指针。该指针应当是之前通过GuiAddQWidgetTab添加进界面的同一个对象返回值该函数不返回任何值void。它是一条发后即忘fire-and-forget的桥接消息调用后立即返回标签页的实际关闭动作由 GUI 线程异步完成。从桥接层到界面的完整调用链理解GuiCloseQWidgetTab的关键在于它横跨 x64dbg 的调试器进程/线程dbg 侧与GUI 进程/线程gui 侧两层架构。整条调用链如下1. 桥接层发送 GUI 消息插件调用GuiCloseQWidgetTab后实际执行的是 bridgemain.cpp 中的桥接实现BRIDGE_IMPEXP void GuiCloseQWidgetTab(void* qWidget) { _gui_sendmessage(GUI_CLOSE_QWIDGET_TAB, qWidget, nullptr); }注意两点实现细节参数类型在桥接层被降为void*GUI_CLOSE_QWIDGET_TAB消息宏在 bridgemain.h 中的定义即为msg(GUI_CLOSE_QWIDGET_TAB, QWidget*, unused)QWidget*指针以原始指针形式随消息传递_gui_sendmessage将消息投递到 GUI 线程的消息队列因此该调用对调用方线程是安全的但关闭动作本身并不在调用线程同步执行。2. GUI 桥接消息分发为 Qt 信号GUI 侧收到GUI_CLOSE_QWIDGET_TAB消息后在 Bridge.cpp 中将其转换为 Qt 信号case GUI_CLOSE_QWIDGET_TAB: emit closeQWidgetTab((QWidget*)param1); break;对应的信号closeQWidgetTab(QWidget*)声明于 Bridge.h与addQWidgetTab、showQWidgetTab三个信号并列构成插件 QWidget 标签页的完整生命周期接口。3. 主窗口槽真正关闭标签页MainWindow在构造时建立信号与槽的连接MainWindow.cppconnect(Bridge::getBridge(), SIGNAL(closeQWidgetTab(QWidget*)), this, SLOT(closeQWidgetTab(QWidget*)));槽函数实现在 MainWindow.cppvoid MainWindow::closeQWidgetTab(QWidget* qWidget) { for(int i 0; i mTabWidget-count(); i) { if(mTabWidget-widget(i) qWidget) { mTabWidget-DeleteTab(i); break; } } }实现逻辑非常直接遍历主标签控件mTabWidget的全部页面按指针匹配到目标 QWidget 后调用DeleteTab(i)删除对应标签页。从中可以推断出两点使用前提qWidget必须是当前确实存在于标签栏中的指针否则遍历不命中函数静默无操作匹配依据是指针相等mTabWidget-widget(i) qWidget因此传入错误的指针或已失效的指针不会关闭任何标签页也不会产生可见报错。与标签页添加、显示 API 的配合GuiCloseQWidgetTab不是孤立存在的它需要与标签页生命周期中的另外两个桥接函数配合使用函数作用桥接消息GuiAddQWidgetTab将 QWidget 添加为 GUI 的新标签页GUI_ADD_QWIDGET_TABGuiShowQWidgetTab显示标签页并将其置为焦点GUI_SHOW_QWIDGET_TABGuiCloseQWidgetTab关闭移除标签页GUI_CLOSE_QWIDGET_TAB三者均定义于 bridgemain.cpp在 GUI 侧对应 Bridge.h 的三个信号与 MainWindow.cpp 的三个槽。其中GuiAddQWidgetTab的槽实现MainWindow.cpp还揭示了标签页原生名称nativeName的生成规则对理解关闭行为有帮助void MainWindow::addQWidgetTab(QWidget* qWidget) { QString nativeName qWidget-objectName(); if(nativeName.isEmpty()) nativeName qWidget-metaObject()-className(); nativeName Plugin nativeName.replace( , _).replace(, _); WidgetInfo info(qWidget, nativeName); addQWidgetTab(info.widget, info.nativeName); mPluginWidgetList.append(info); }即优先取objectName()为空则退回类名并统一加上Plugin前缀、将空格与等号替换为下划线同时把WidgetInfo记入mPluginWidgetList插件控件清单。插件中的典型使用示例以下是插件在自定义 QWidget 标签页生命周期管理中的典型用法对应 GuiAddQWidgetTab.md 与本文所述 API 的组合#include QWidget #include bridge/bridgemain.h // 1. 创建并添加标签页 QWidget* myTab new QWidget(nullptr); myTab-setObjectName(MyPluginPanel); myTab-setWindowTitle(My Plugin); GuiAddQWidgetTab(myTab); // 添加到 GUI 标签栏 // 2. 需要时将标签页切换到前台 GuiShowQWidgetTab(myTab); // 3. 关闭并移除标签页 GuiCloseQWidgetTab(myTab);在实际插件中关闭动作通常由以下场景触发插件菜单中提供关闭面板入口用户点击后调用GuiCloseQWidgetTab插件窗口自身的关闭按钮重写closeEvent中调用该函数确保标签页从主界面移除插件卸载清理阶段遍历自身维护的 QWidget 列表逐一关闭。脚本 API 中的对应封装GuiCloseQWidgetTab还被封装进 x64dbg 的脚本 API插件或脚本可通过Script::Gui命名空间调用。相关实现位于 _scriptapi_gui.cppSCRIPT_EXPORT void Script::Gui::AddQWidgetTab(void* qWidget) { GuiAddQWidgetTab(qWidget); } SCRIPT_EXPORT void Script::Gui::ShowQWidgetTab(void* qWidget) { GuiShowQWidgetTab(qWidget); } SCRIPT_EXPORT void Script::Gui::CloseQWidgetTab(void* qWidget) { GuiCloseQWidgetTab(qWidget); }注意脚本 API 层参数统一为void*需要调用方自行确保传入的是有效的QWidget*。使用注意事项综合源码实现使用GuiCloseQWidgetTab时有几点需要留意异步性函数通过消息队列异步关闭标签页调用后界面更新存在极短延迟不要在调用后立即假设标签页已不存在指针有效性关闭匹配基于指针相等务必传入与GuiAddQWidgetTab完全相同的指针对象销毁后调用是无害但无效的遍历不命中生命周期归属从 Qt 的对象模型看QWidget 被添加为标签页后由主标签控件接管父子关系DeleteTab移除页面时相应的清理逻辑由 Qt 侧完成插件不应在关闭后再次 delete 同一对象以免双重释放GUI 线程亲和性QWidget 操作要求 GUI 线程上下文而桥接层已负责把消息投递到 GUI 线程因此插件在任意线程调用该函数都是安全的无需自行切换线程无返回值无法通过返回值判断关闭是否成功如需确认结果可自行维护插件侧的控件状态。相关函数与文档本文主题文档GuiCloseQWidgetTab.md配套添加文档GuiAddQWidgetTab.mdGUI 函数族索引gui/index.rst桥接层实现bridgemain.cpp、bridgemain.hGUI 消息分发Bridge.cpp、Bridge.h主窗口槽实现MainWindow.cpp脚本 API 封装_scriptapi_gui.cpp【免费下载链接】x64dbgAn open-source user mode debugger for Windows. Optimized for reverse engineering and malware analysis.项目地址: https://gitcode.com/gh_mirrors/x6/x64dbg创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

create-t3-app 贡献指南:本地开发环境搭建、CLI/文档开发流程与翻译协作实战

create-t3-app 贡献指南:本地开发环境搭建、CLI/文档开发流程与翻译协作实战

create-t3-app 贡献指南:本地开发环境搭建、CLI/文档开发流程与翻译协作实战 【免费下载链接】create-t3-app The best way to start a full-stack, typesafe Next.js app 项目地址: https://gitcode.com/gh_mirrors/cr/create-t3-app 本篇技术指南以仓库根…

2026/9/21 17:51:33 阅读更多 →
Tampermonkey脚本实现共享账号Cookie注入:原理、实现与安全边界

Tampermonkey脚本实现共享账号Cookie注入:原理、实现与安全边界

1. 这个脚本到底解决了什么问题第一次接触共享账号这个概念,是在一个资源交流群里。当时有人发了一个链接,说“装个油猴脚本就能一键登录,不用自己注册”。我当时的反应是:这东西靠谱吗?后来自己折腾了一遍&#xff0c…

2026/9/21 12:10:40 阅读更多 →
Flutter Web 2048开发实战:AI辅助与Web渲染深度优化

Flutter Web 2048开发实战:AI辅助与Web渲染深度优化

1. Trae 是什么?它和 Flutter Web 开发 2048 有什么真实关系?先说结论:Trae 不是 Flutter 官方生态中的工具,也不是 Dart 或 Web 开发领域的标准构建链路组件。这一点必须 upfront 澄清——因为从你看到的热搜词列表里&#xff0c…

2026/9/21 8:35:28 阅读更多 →

最新新闻

3个坑让仙台地图渲染崩盘?这份保姆级教程救你

3个坑让仙台地图渲染崩盘?这份保姆级教程救你

3个坑让仙台地图渲染崩盘?这份保姆级教程救你 上周给一个医疗SaaS项目做区域数据可视化,客户点名要集成“仙台地图”组件。我信心满满,结果第一版代码跑起来,控制台直接炸出一屏红字,StackTrace 长得像天书,滚动条都拉不到底。…

2026/9/22 1:02:19 阅读更多 →
3个新手避坑点:北京积分落户新政策源码级拆解与帧对比选型

3个新手避坑点:北京积分落户新政策源码级拆解与帧对比选型

3个新手避坑点:北京积分落户新政策源码级拆解与帧对比选型 看了一堆教程还是不会写项目?别怪自己笨,是你没搞懂底层逻辑。北京积分落户新政策的核心其实就是一本动态账本,很多新手在报名材料清单整理时栽跟头,不是因为材料不全,而是因为没看懂“加权逻…

2026/9/22 1:02:19 阅读更多 →
自动重拨最佳实践

自动重拨最佳实践

3个坑让你告别手动重拨:新手避坑指南 学会语法却不知怎么搭项目,是很多刚入行同学的通病。特别是处理网络不稳定场景时,盯着报错日志发呆,只会手动刷新页面。自动重拨机制看似简单,实则暗藏玄机,稍不留神就陷入死循环。 入口定位:为什么你需要它…

2026/9/22 1:02:19 阅读更多 →
商标宝注册全流程解析与避坑最佳实践

商标宝注册全流程解析与避坑最佳实践

商标宝注册全流程解析与避坑最佳实践 刚拿到商标宝查询结果,或者在提交注册时看到那一长串红色的 StackTrace 报错,是不是瞬间大脑宕机?很多人以为这是系统崩溃,其实是你的申请文件触发了审查系统的硬性拦截。别慌,这行干久了就知道,报错不…

2026/9/22 1:02:19 阅读更多 →
3个实战项目拆解ustcmail,彻底搞懂USTC邮件系统

3个实战项目拆解ustcmail,彻底搞懂USTC邮件系统

3个实战项目拆解ustcmail,彻底搞懂USTC邮件系统 看了一堆教程还是不会写项目?这是大多数应届生在准备大厂面试时的真实困境。你背了无数八股文,刷了上百道算法题,但一旦面试官问起“你做过什么实战项目”,你的大脑瞬间空白。特别是当涉及到…

2026/9/22 1:02:19 阅读更多 →
高速工具钢源码解析: 3步搞定版本API变更坑

高速工具钢源码解析: 3步搞定版本API变更坑

高速工具钢源码解析: 3步搞定版本API变更坑 版本升级后 API 全变了,这是转岗工程师最崩溃的瞬间。你刚把旧版逻辑跑通,新版文档却换了天,报错堆栈像天书。别慌,我们直接拆解 高速工具钢 相关的底层逻辑,通过 源码解析 找到不变的内核。…

2026/9/22 1:01:18 阅读更多 →

日新闻

3台商务办公笔记本实测:手写实现环境配置,告别卡半天

3台商务办公笔记本实测:手写实现环境配置,告别卡半天

3台商务办公笔记本实测:手写实现环境配置,告别卡半天 配置环境就卡半天?别怪机器慢,多半是你没选对工具链。在Java、Go或Python的项目现场, 手写实现…

2026/9/22 0:00:41 阅读更多 →
剑帝加点速查手册:3分钟搞懂核心逻辑

剑帝加点速查手册:3分钟搞懂核心逻辑

剑帝加点速查手册:3分钟搞懂核心逻辑 面试被问原理答不上来,是不是常态?别慌。很多开发者对着 GitHub 开源仓库里的代码发呆,看似简单实则暗藏玄机。今天这份【剑帝加点】速查手册,直接带你拆解核心实现,把面试必考的原理讲透。…

2026/9/22 0:00:41 阅读更多 →
手写实现图片压缩网站核心:搞定WebP转换与质量调优

手写实现图片压缩网站核心:搞定WebP转换与质量调优

手写实现图片压缩网站核心:搞定WebP转换与质量调优 复制来的代码跑不通不知道怎么调?别慌,这种“复制粘贴地狱”在开发圈太常见了。尤其是做 图片压缩网站…

2026/9/22 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/21 3:13:20 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/21 2:19:36 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/21 4:51:05 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/21 15:36:51 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/21 15:36:51 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/19 23:35:34 阅读更多 →