#include<iostream>
#include<windows.h>
#include<SetupAPI.h>
#include<INITGUID.h>
#pragma comment(lib,"setupapi.lib")
DEFINE_GUID(GUID_DEVINTERFACE_USB_HUB,
0x0040D94D,0xBE36,0x48B1,0x96,0x05,0x0e,0xfb,0x33,0xd5,0xc2,0x06);
//在注册表\HKEY_LOCAL_MACHINE\SYSTEM下有三项:
//ControlSet001、ControlSet002、CurrentControlSet
//每项下面路径类似..\Enum\USB\VID_04CC&PID_121B
//(VID_04CC厂商编号,PID_121B设备编号构成设备唯一身份标识)
//每一项都可以找到GUID,但只有最上面一项可以找到一个键:
//\HKEY_LOCAL_MACHINE\SYSTEM\Enum\USB\VID_04CC&PID_121B\1401010000\Device Parameters
//下的DeviceInterfaceGUIDs这个键值才是本设备唯一GUID,其它GUID是设备类通用GUID
//本程序主要就是用这个GUID来判断USB驱动是否安装成功
#define GUID_CLASS_USB_HUB GUID_DEVINTERFACE_USB_HUB
using namespace std;
int main()
{
LPGUID lpGuid = (LPGUID)&GUID_CLASS_USB_HUB;
HDEVINFO info = SetupDiGetClassDevs(lpGuid,NULL,NULL,DIGCF_DEVICEINTERFACE);
SP_DEVINFO_DATA DeviceInfoData = { sizeof(DeviceInfoData)};
BOOL IsInstalled = SetupDiEnumDeviceInfo(info,0,&DeviceInfoData);
SetupDiDestroyDeviceInfoList(info);
if(IsInstalled)
{
return 1;
}
else
{
return 0;
}
}
以上代码生成执行文件后,在Inno Setup中执行该程序,取得返回值(return 0/1;),
用该返回值(IsInstalled)来判断驱动一否已经安装成功;
Inno setup:
var
IsInstalled:Interger;
FileNameDriverC:String;
begin
FileNameDriverC := WizardDirValue + '\***.exe';
Exec(FileNameDriverC,'','',SW_HIDE,ewWaitUntilTerminated,IsInstalled);
end;