记录上位机的Qt开发(一):调用驱动的禁用和重启
前言
由于硬件的问题,我开发的采集卡在刚开机后无法正确运行,经过我不懈的测试(不断关机、开机、重启),发现需要在开机后重新禁用一下采集卡对应的驱动,再启动驱动,这部分任务可以通过上位机来完成。
在应用程序调用驱动时,需要的参数是驱动的设备实例路径,这个路径可以在设备管理器——右键驱动的属性——详细信息——设备实例路径中查看。
1. 提升权限
在上位机上操作硬件驱动需要管理员权限,需要在qmake步骤实现,即在.pro项目文件中添加管理员权限:
QMAKE_LFLAGS += /MANIFESTUAC:\"level=\'requireAdministrator\' uiAccess=\'false\'\"
当在Qt Creator调试项目时,由于项目权限是管理员权限,所以打开Qt Creator时也要以管理员身份运行。
2. 链接库
对于驱动的操作可以调用Windows驱动开发的API,驱动和应用程序之间的API为SetupAPI,故链接SetupAPI的.lib静态库,涉及到其中的CfgMgr32.dll,链接库后使用时需要导入头文件:
#include <setupapi.h>
#include <Cfgmgr32.h>
3. 驱动的禁用和重启
在应用程序调用驱动时,需要的参数是该驱动的设备实例路径,但若是直接在源码中调用该路径,那么应用程序发布后便无法修改,隐藏需要给用户提供一个可交互的接口,用来在驱动更新后修改驱动设备实例路径,使得应用程序仍能调用驱动。
(1)获取当前目录并构建文件路径,即应用程序.exe所在目录+文件名:
QString filePath = QDir::currentPath() + "/XXXXXX.txt";
(2)用QFile打开路径,若文件不存在咋创建一个该文件,并写入当前驱动实例路径,这个路径中有反斜杠\,为避免转义,在字符串加上R"(…)"来创建一个原始字符串字面量,例如:
file.write(R"(XXX\XXXXX\XXXXX)");
(3)打开文件读取整个TXT文件的内容;
(4)路径字符串由QString类型转为std::string类型,方便使用Windows的SetupAPI;
(5)获取设备实例句柄,禁用驱动、启用驱动:
CONFIGRET status = CM_Locate_DevNodeA(&devInst, (DEVINSTID_A)instanceId.c_str(), CM_LOCATE_DEVNODE_NORMAL); //获取设备实例句柄
status = CM_Disable_DevNode(devInst, 0); //禁用驱动
status = CM_Enable_DevNode(devInst, 0); //启用驱动
总结
本篇博客是个人开发记录,若有错误请指正,大家一起讨论。