本帖最后由 gytxtx 于 2025-3-22 10:08 编辑
起源
以前调试编译后的 GUI 程序时经常无法得知日志内容,而将日志输出到日志文件又不太方便
且又闲来无事刷 B 站看到了这个视频:
https://www.bilibili.com/video/BV1bZQXYvETj/
视频里面主要是修改 PE 文件头中的 Subsystem 为 Console 来实现 GUI 窗口显示控制台输出的
我就在想有没有一种可以不修改目标 EXE 就可以实现的方案(修改 EXE 会破坏数字签名)
于是就有了这个源码
其他方法
在网上找到了一种通过命令行来捕获 GUI 程序的输出内容,但是那样还是有些不方便(我想要一种实时显示输出内容的方法,而不是在程序窗口和日志文件之间来回切换,太麻烦了)
# 命令提示符 (CMD)
程序名.exe > output.log
# PowerShell
.\程序名.exe | Out-File -FilePath output.log -Encoding UTF8
补充背景
刷论坛时看到了有大佬通过匿名管道重定向了控制台输出(具体是下面的帖子)
原理
利用 Windows API 的 匿名管道(Anonymous Pipe) 和 进程继承句柄 特性,实现以下流程:
父进程 创建管道,并启动 子进程(目标 GUI 程序)。
将子进程的 stdout / stderr 重定向到管道。
父进程通过管道读取子进程的输出,并实时显示或保存。
有何作用?
比如使用此方法便捷查看 GUI 程序的输出,提升了开发人员定位问题的效率(将要输出的内容使用 标准输出函数 输出到控制台,用户不可见)
优势
- 实时捕获 GUI 程序中通过标准输出函数(如调试信息、状态日志)写入的内容,无需手动检查日志文件。
- 突破 GUI 程序无控制台窗口的限制,使调试信息可视化。
- 在不修改程序界面的情况下监控后台日志
- 允许开发者或测试人员在程序运行时直接监控输出流,提升问题定位效率。
- 支持输出内容二次处理(如关键字过滤)
- 避免修改 PE 文件结构导致的数字签名失效问题
其他
使用 TX 的 QQNT 作为目标程序时,可以实时显示控制台输出
(只测试了 QQNT)
但是在易语言程序中使用 标准输出() 函数,就只能等目标程序运行完毕之后查看输出内容
暂时没有解决方案,希望大佬指点一下
下载
请在下方的附件中下载源代码:
获取 GUI 应用程序的控制台输出内容.zip
(32.87 KB, 下载次数: 10)
亦或者,在蓝奏云中下载源代码:
https://wwcw.lanzoue.com/it1HE2r9imze
附件中包含 源码 + 示例。
使用
本源码各位可随意转载、使用,欢迎一同改进本源码。
写在最后
如果这个源码对你有所帮助,欢迎点击 点赞 或 评分 支持,你的鼓励是我持续开发的动力!
如果在使用过程中发现任何问题或优化建议,请直接在下方回帖,我会尽我所能的改进本源码!
关于使用 标准输出() 函数输出延迟的问题,如果您有相关经验,欢迎在评论区分享解决思路,共同完善这个工具链!
非常感谢大家能看到这里!
|