首先,用C++实现这个上位机不是什么难事,主要是记录一下遇到的额外问题。

因为需要使用动态链接库,一开始以为是Qt不熟练,使用动态链接库的方式有问题,但尝试许久还是无法解决。

在运行程序时,Qt程序直接中断,错误

1
2
The program has unexpectedly finished. 
The process was ended forcefully.

不知道是什么原因。

因此在vs2019上重新尝试,报错:

1
应用程序无法正常启动(0xc0150002)

搜索

,网络上有牛人博客解释这个问题,

在计算机管理》事件查看器》Windows日志》应用程序中

查看错误信息:

1
“D:\workspace\c++\cantest\x64\Debug\ControlCAN.dll”的激活上下文生成失败。 找不到从属程序集 Microsoft.VC90.MFC,processorArchitecture="amd64",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="9.0.21022.8"。 请使用 sxstrace.exe 进行详细诊断。

说明是链接库加载的问题,ControlCAN.dll的依赖 Microsoft.VC90.MFC,该程序包含在 VC++ 2008 sp1 runtime,因此需要安装此环境。在软件管家里搜索,发现一个游戏环境程序集合安装包,该包中有vc08x64.exe,安装后,程序即可正常运行。

好几个小时的迷茫就这么简单的解决了。

但是有个疑问是,为何厂家的例程可以正常运行?

写到这里,突然想起有一项还没试过。即是编译完程序后,不在Qt或vs2019里运行,直接在编译目录里运行,不知道是否正常?


总结以上经历,此次遇到的问题耗费了我差不多六七个小时,但最终解决时,才发现这并不是一个多难得问题。那时间用在了哪?在Qt上。

实际上如果我已经安装了VC++2008 sp1 runtime,那么从我写代码一开始,这个问题就不会发生。

但我没有安装,此问题发生了。

我首先将怀疑归到Qt调用动态链接库的方式上,因为我对Qt也是个初学者,在遇到问题时首先是对自己的不自信,Qt是否是这样调用链接库的,这样调用对不对?

我将大部分的时间耗费到了调用链接库的方式上,但这样的尝试其实一开始是必须的,但四五个小时就没有意义了。钻了牛角尖。

我对Qt并不熟悉,所以再多尝试也只是去碰运气,下一次没准就能正常运行了呢?

长时间的失败使我意识到是该换个熟悉的工具试试了,果然用vs2019后,虽然也不成功,但它给出了与Qt不一样的错误提示,根据此错误提示,我知道接下来该怎么做。

问题就在使用vs2019后的不到半小时解决了,这让人开心,但同时也让我郁闷。

也许这就是学习一样新的东西所要付出的一些代价吧。

浪费了时间只为得到一个经验教训。

在使用新工具遇到无法解决的问题时,不妨先回头用熟悉的工具去验证,找到问题的真正原因,避免白白浪费时间。