上一篇日志说到判断是否是手机设备,但是要与手机进行通讯就必须有驱动程序,否则只能当做“便携储存设备”使用,只能往里面放文件,也许你已经满足了,但是你想一下91助手只是给你提供存放文件那么简单吗?如果是的话91助手还有鸟用啊?因为我们直接打开“我的电脑”就能打开这个类似U盘的东西了. 再想一想,如果你的程序可以跟手机说"我给个apk你,你安装一下",然后你的手机就装上去了,那不就方便了吗? 这才是卖点~
好,上面都是废话----------------------------------------------------------------------------------------------------------------------
上一篇日志中说到的枚举过程只是判断是否有手机的话似乎太浪费了. 所以这里要提前交代一下再枚举过程发现了手机设备要记录下该设备的 "实例ID" ,这个和"兼容ID"、"硬件ID"不一样,前者是电脑给设备分配的ID便于电脑对I/O设备的管理,而后两者是设备本身的属性信息。
获取实例ID的方法:
LPTSTR szInstanceID = NULL
WORD iBuffSize = 0;
SetupDiGetDeviceInstanceId(hDevInfoSet,&deviceInfoData,szInstanceID ,iBuffSize,&iBuffSize ); //获取实例ID的buff需要的大小, hDevInfoSet和deviceInfoData
int err = GetLastError();
if(err != ERROR_INSUFFICIENT_BUFFER)
return;
szInstanceID = (LPTSTR)LocalAlloc(LPTR,buffSize*sizeof(WCHAR));
SetupDiGetDeviceInstanceId(hDevInfoSet,&deviceInfoData,szInstanceID ,iBuffSize ,&iBuffSize ); //获取实例ID
要判断设备是否有安装驱动使用到两个方法:CM_Locate_DevNode 和 CM_Get_DevNode_Status ,头文件#include <cfgmgr32.h>,主要实现如下:
DEVINST deviceInstance;
if (CM_Locate_DevNode(&deviceInstance,szInstanceID ,CM_LOCATE_DEVNODE_NORMAL) == CR_SUCCESS) //获取设备ID对应的设备实例句柄
{
DWORD tatus;
DWORD problemNumber;
if (CM_Get_DevNode_Status(&status,&problemNumber,deviceInstance,0) == CR_SUCCESS)
//获取设备状态和设备状态细节
{
if (!(status&DN_HAS_PROBLEM)) //判断设备是否存在问题,代表驱动已安装
{
//设备无异常,就是说驱动正常
}
else
{
if (problemNumber == CM_PROB_DRIVER_FAILED_PRIOR_UNLOAD
|| problemNumber == CM_PROB_DRIVER_FAILED_LOAD)
{
//设备驱动加载不成功
}
else
{
//有不明原因,可以归结为没安装驱动
}
}
}
}
好吧,驱动是否安装的判断就这样子。一点都不麻烦。
原版地址:http://mongamind.blog.163.com/blog/static/19328726120139310184154/
好,上面都是废话----------------------------------------------------------------------------------------------------------------------
上一篇日志中说到的枚举过程只是判断是否有手机的话似乎太浪费了. 所以这里要提前交代一下再枚举过程发现了手机设备要记录下该设备的 "实例ID" ,这个和"兼容ID"、"硬件ID"不一样,前者是电脑给设备分配的ID便于电脑对I/O设备的管理,而后两者是设备本身的属性信息。
获取实例ID的方法:
LPTSTR szInstanceID = NULL
WORD iBuffSize = 0;
SetupDiGetDeviceInstanceId(hDevInfoSet,&deviceInfoData,szInstanceID ,iBuffSize,&iBuffSize ); //获取实例ID的buff需要的大小, hDevInfoSet和deviceInfoData
int err = GetLastError();
if(err != ERROR_INSUFFICIENT_BUFFER)
return;
szInstanceID = (LPTSTR)LocalAlloc(LPTR,buffSize*sizeof(WCHAR));
SetupDiGetDeviceInstanceId(hDevInfoSet,&deviceInfoData,szInstanceID ,iBuffSize ,&iBuffSize ); //获取实例ID
要判断设备是否有安装驱动使用到两个方法:CM_Locate_DevNode 和 CM_Get_DevNode_Status ,头文件#include <cfgmgr32.h>,主要实现如下:
DEVINST deviceInstance;
if (CM_Locate_DevNode(&deviceInstance,szInstanceID ,CM_LOCATE_DEVNODE_NORMAL) == CR_SUCCESS) //获取设备ID对应的设备实例句柄
{
DWORD tatus;
DWORD problemNumber;
if (CM_Get_DevNode_Status(&status,&problemNumber,deviceInstance,0) == CR_SUCCESS)
//获取设备状态和设备状态细节
{
if (!(status&DN_HAS_PROBLEM)) //判断设备是否存在问题,代表驱动已安装
{
//设备无异常,就是说驱动正常
}
else
{
if (problemNumber == CM_PROB_DRIVER_FAILED_PRIOR_UNLOAD
|| problemNumber == CM_PROB_DRIVER_FAILED_LOAD)
{
//设备驱动加载不成功
}
else
{
//有不明原因,可以归结为没安装驱动
}
}
}
}
好吧,驱动是否安装的判断就这样子。一点都不麻烦。
原版地址:http://mongamind.blog.163.com/blog/static/19328726120139310184154/