#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;