新的启程系列-CTK使用 新版本main函数退出报Qt5Guid.dll bug问题解决以及老版本CTK的使用

        最近一直比较忙,没有时间来更新文档记录,今天正好抽个时间来记录点东西。毕竟年龄大了,有些东西仅仅靠脑子,记不住,即使记住也是暂时的。

        今天更新的东西比较多,主要是有两部分内容,第一部分是新版本的CTK 插件框架主程序退出出现的bug以及该bug的解决。第二部分,采用老版本的CTK(CTK-2018-10-29)插件框架的使用记录。

        1.上一篇,我们用win10系统 + vs2019 + qt5.15.2编译了ctk的库,我的使用是:mainWindow 主窗口是作为一个插件来实现的,main函数仅仅是启动插件,这样就带来了一个bug。bug描述如下:就是在程序退出的时候崩溃,显示的是qt5guid.dll 中引发的异常:0xC0000005:读取位置0xFFFFFFFFFFFFFFFF时发生访问冲突,跟踪了并行堆栈,发现也就一个主线程,没其他的线程,具体问题见下面截图:

在main()函数return ret,ret的值为0,直接return 0;报的错误是一样的。

 

这个问题,我也了解了下,使用过的CTK的同行,都遇到这个问题,问题依然是没有解决。尴尬,问题的原因,能力有限,我也没搞清楚,我们继续往下看吧。查看并行堆栈,发现都找不到对应的pdb文件,这个时候,可以去qt的官网,下载对应的pdb文件,我这里给出网址(已vs2019 x64位版本为例,其他版本应该是一样的,),免得大家再去折腾:

https://download.qt.io/online/qtsdkrepository/windows_x86/desktop/qt5_5152/qt.qt5.5152.debug_info.win64_msvc2019_64/

下载以下两个文件: 

1) 5.15.2-0-202011130602qtbase-Windows-Windows_10-MSVC2019-Windows-Windows_10-X86_64-debug-symbols

2) 5.15.2-0-202011130602qttools-Windows-Windows_10-MSVC2019-Windows-Windows_10-X86_64-debug-symbols

然后解压到指定的目录下,我这里是解压到了qt的安装路径下了,如下图:

 

 然后到vs的菜单栏-- 工具 -- 选项--调试--符号,添加上述下载的两个文件解压后的目录:

添加完毕后,在启动调试程序, 并行堆栈的显示如下图所示:

这是出现的问题,猜测,可能是CTK的版本更新后,用法有所改动。这个问题(针对目前github上master新版本,其他版本没有测试),我们可以采用另外的一种方式来去避免。 还是要参考CTK给的官方例子 ctkPluginGenerator项目。查看ctkPluginGeneratorMain.cpp源代码;如下图:

 它的主窗口程序是放到了exe中,而不是像我放到plugin中。按照这个思路,在我们的测试代码中新建一个继承QMainWindow窗口类,注意一定是QMainWindow窗口类,而不能是QWidget或QDialog窗口类,非QMainWindow窗口类,报的错误跟上述描述的问题一样。我们来看下效果。

ok,这样我们就可以正常的使用ctk的插件的相关功能了。有点遗憾的是:上述出现的问题,我依然没有解决,希望有懂的大佬,帮忙解决下这个问题。

如果主窗口在插件中实现的话,就会方便很多,可以通过事件来通知主窗口程序的显示、隐藏、退出。因为我的程序可能会通过网络通讯的方式(网络通讯是写到另外一个插件中的)来通知主窗口的显示、隐藏以及退出等,网络通讯的功能,我这里采用了另外一种思路:在主程序中,启动定时器,定时的去扫描变量是否变化来实现主窗口的显示、隐藏以及退出功能的。

2.到github上下载CTK,这时候需要选择tag标签页下的2018-10-29版本,如下图所示:

 下载后,编译环境同样采用window10 + qt5.15.2 + vs2019 64位,具体的编译可参考链接:

新的启程系列-CTK编译(windows 10 + vs2019 + qt5.15.2)_hong_yu0315的博客-CSDN博客

 用cmake-gui工具时,会出现很多的警告,如下图所示,我们可暂且忽略警告,直接点击“generate”,然后打开vs2019 编译CTK插件库。

 我们将上面的测试代码移植到CTK-2018-10-29里面(我这里为了两个版本都进行测试,其实可以改变测试的链接头文件和库文件即可)。

然后采用同样的代码来测试。测试的结果如下:

 运行效果如下:

 直接关闭mainWindow窗口,这个mainWindow是一个插件,我们来看下vs2019的输出窗口,

我们可以看到,老版本的CTK程序是可以正常退出的。

        从上面可以看出,CTK新老版本在使用上是有些区别的。这可根据大家的功能需求去选择到底是采用哪个版本。就我个人而言,可能老版本更合适写,新增加的功能,我貌似也用不到。嘎嘎,好了,今天就到这里,有疑问可以跟我联系。可能回复不是很及时,见谅! 

 

 

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值