问题描述:今天测试公司软件,需要软件运行需要依赖一个注册工具(公司内部自己做的),按照工具维护人员提供的操作方式方法进行操作,也确实在注册表内看到了相关注册信息(证明注册成功)。
然后兴高采烈的打开目标软件,尴尬的事情发生了,目标软件启动的同时将注册工具的进程给结束掉了!!!
之后怀疑是否与注册路径中有中文有关,修改目标软件及工具软件路径,进行了了反注册,重新注册的操作流程,查看注册表,路径修改的OK,重新启动目标软件,尴尬的是目标软件启动的同时又将注册工具的进程给结束掉了!!
又怀疑是否是串口本身有问题,被占用?NO,另外一个依赖串口的工具,却可以正常使用串口进行相关工作。而且通过目标软件启动后,串口工具确实已经被调起来了,但是紧接着就被结束掉了,说明工具本身确实注册成功了。
MMP,之后尝试了电脑重启、修改更改UAC设置(等级设置到最低)、检查是否存在异常进程等,均未解决问题。
一支穿云箭,千军万马来相见。
自己搞不定,只能叫人。立马找到了工具维护人员寻求帮助,建议使用DebugView打印串口工具内的日志,立刻发现了一个异常日志:
[5836] 0x0d74 [Error] [CCommStarter::s_workProc:169]>>> CoCreateInstanceEx failed. with hr:80029c4a
CoCreateInstanceEx接口反馈了一个系统错误:80029c4a
解下来就有了排查的方向:80029c4a
这个错误是是什么含义呢? 然后找到了包含这个错误码的头文件:
C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Include\WinError.h
//
// MessageId: TYPE_E_CANTLOADLIBRARY
//
// MessageText:
//
// Error loading type library/DLL.
//
#define TYPE_E_CANTLOADLIBRARY _HRESULT_TYPEDEF_(0x80029C4AL)
串口工具使用的库加载的有问题?why?
问了度娘,找到了一篇百度经验:https://jingyan.baidu.com/article/3065b3b6927f9cbecff8a494.html,其中的方法二引起了我的注意:
方法2:
原因:存在多个版本
方法:在注册表中删除其他版本
找到注册表:HKEY_CLASSES_ROOT\TypeLib\{00020813-0000-0000-C000-000000000046},删除其他版本。
莫非,难道,这个镜像有遗留版本的注册信息,然后 win+r 输入 regedit,打开注册表,按照串口工具的名称开始搜索,直到搜到了一个带路径的信息,该路径不是我注册时的路径,而是指向一个已经不存在的路径。
有点忽然大悟,立马按照自己的注册路径手动改掉这条注册信息,重启目标软件,一切恢复了安静祥和的氛围。
战斗状态解除。
CoCreateInstanceEx介绍:
https://docs.microsoft.com/zh-cn/windows/win32/api/combaseapi/nf-combaseapi-cocreateinstanceex?redirectedfrom=MSDN
https://blog.csdn.net/gaoxiaowei/article/details/5701779
https://baike.baidu.com/item/CoCreateInstance/7400606?fr=aladdin