请各位大内高手帮忙看下这个问题怎么解决,谢谢!功能:当优盘插入到电脑上,程序先禁用优盘,同时程序识别出优盘的ID号,如果优盘的ID号在允许的范围内,则启用优盘,否则禁用。禁用后,不影响鼠标、键盘及其他USB设备的使用。现在的问题:每次都禁用的时候都是把所有的USB端口都禁用了,导致其他USB设备不能正常使用,关键在一个函数上。SetupDiEnumDeviceInfo(IntPtr DeviceInfoSet, uint MemberIndex, ref SP_DEVINFO_DATA DeviceInfoData),其中的“unit MemberIndex”这个参数我就不知道怎么取值了。不知道这个参数怎样取值,才能实现禁用优盘所在的USB端口。下面是实现端口控制的代码。注:代码源自网上。function ChangeDeviceState(hDevInfo: HDEVINFO; NewStatus: DWORD;
   SelectedItem: DWORD): Boolean;
var
   PropChangeParams: SP_PROPCHANGE_PARAMS;
   DeviceInfoData: SP_DEVINFO_DATA;
begin
   Result := False;   DeviceInfoData.cbSize := SizeOf(SP_DEVINFO_DATA);
   if not SetupDiEnumDeviceInfo(hDevInfo, SelectedItem, @DeviceInfoData) then Exit;   // Set the PropChangeParams structure.
   PropChangeParams.ClassInstallHeader.cbSize := SizeOf(SP_CLASSINSTALL_HEADER);
   PropChangeParams.ClassInstallHeader.InstallFunction := DIF_PROPERTYCHANGE;
   PropChangeParams.Scope := DICS_FLAG_GLOBAL;
   PropChangeParams.StateChange := NewStatus;   if not SetupDiSetClassInstallParams(hDevInfo, @DeviceInfoData,
     PSP_CLASSINSTALL_HEADER(@PropChangeParams), SizeOf(PropChangeParams)) then
     Exit;   // Call the ClassInstaller and perform the change.
   if not SetupDiCallClassInstaller(DIF_PROPERTYCHANGE, hDevInfo,
     @DeviceInfoData) then
     Exit;   Result := True;
end;
function ControlDisk(nStatus, nIndex: Integer): Boolean;
var
   Guid: TGUID ;
   GUIDString: string;
   hDevInfo: Cardinal;
   i: DWORD;
   DeviceInfoData: SP_DEVINFO_DATA;
begin
   Result := False;
   if (nStatus = -1) then Exit;   ZeroMemory(@Guid, sizeof(TGUID));
   case nIndex of
     0: // 0 代表软驱
       GUIDString := '{4D36E980-E325-11CE-BFC1-08002BE10318}';
     1: // 1 代表光驱
       GUIDString := '{4D36E965-E325-11CE-BFC1-08002BE10318}';
     2: // 2 代表USB
       GUIDString := '{36FC9E60-C465-11CF-8056-444553540000}';
   end;
   Guid := StringToGUID(GUIDString);   hDevInfo := SetupDiGetClassDevs(@Guid, nil, HWND(nil), DIGCF_PRESENT);
   //hDevInfo :=SetupDiGetClassDevsA(@Guid,nil,0,DIGCF_PRESENT);
   if (hDevInfo = INVALID_HANDLE_VALUE) then Exit;   ZeroMemory(@DeviceInfoData, SizeOf(SP_DEVINFO_DATA));
   DeviceInfoData.cbSize := SizeOf(SP_DEVINFO_DATA);   i := 0;
   while SetupDiEnumDeviceInfo(hDevInfo, i, @DeviceInfoData) do
   begin
     if nStatus   = 1 then
       Result := ChangeDeviceState(hDevInfo, DICS_ENABLE, i)
     else if nStatus = 2 then
       Result := ChangeDeviceState(hDevInfo, DICS_DISABLE, i);
     Inc(i);
   end;

解决方案 »

  1.   


        //然后对设备集合中每个设备进行列举,检查是否是我们要找的设备
        //当找到我们指定的设备,或者设备已经查找完毕时,就退出查找。
        //首先指向第一个设备,即将MemberIndex置为0。
        MemberIndex=0;
        while(1)
        {
            //调用SetupDiEnumDeviceInterfaces在设备信息集合中获取编号为
            //MemberIndex的设备信息。
            Result=SetupDiEnumDeviceInterfaces(hDevInfoSet,
                                               NULL,
                                               &MyGuid,
                                               MemberIndex,
                                               &DevInterfaceData);

            //如果获取信息失败,则说明设备已经查找完毕,退出循环。
            if(Result==FALSE) break;        //将MemberIndex指向下一个设备
            MemberIndex++;
    是你获取设备的编号。具体看看msdn吧
      

  2.   

    TO:xiaowei_001,我用这个函数了,但总提示错误259.也用SetupDiGetClassDevsA得到了句柄,但是调用SetupDiEnumdeviceInterfaces后,再用GetLastError看到的错误就是259,找不到我想要的USB设备在设备列表里的序号。这是为什么呢。