我写过的嵌套循环查询函数,目的是着个位置把不重复的设备名存起来,这个函数写了整整2个小时,才终于可以运行,计算机真辛苦》。。。。。。
====================原创版本,最费力起,也最容易出错
BOOL
Check_and_ADD_USB_Device()
{
int i;
int i2;
int i3;
if ( !GetUsbDeviceFileName(
(LPGUID) &GUID_CLASS_I82930_BULK,
completeDeviceName,0) )
{
// NOISY(("Failed to GetUsbDeviceFileName:%d/n", GetLastError()));
return 0;
}
else
{
TRACE("SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS/r/n");
TRACE(completeDeviceName);
TRACE("/r/n");
for(i=0;i<MAX_USB_Device+1;i++)
{
if(USBDevice_Names[i][0]=='/0') //证明此处是空的;
{
for(i2=0;i2<MAX_USB_Device+1;i2++)//检查是否跟上一个重复
{
if(strcmp(USBDevice_Names[i2],completeDeviceName)==0)
{
int report_error_time;
BOOL Gotit=0;
report_error_time=GetUSBDeviceName_Times;// =给它8次机会获得completeDeviceName
while(report_error_time||(!Gotit))
{
for(i3=0;i3<MAX_USB_Device+1;i3++)
{
if( GetUsbDeviceFileName((LPGUID) &GUID_CLASS_I82930_BULK,completeDeviceName,i3))
{
if(strcmp(USBDevice_Names[i2],completeDeviceName)==0)
continue;
else
{
Gotit=1;
break;//获得不重复的
}
}//获取成功的支线
else
{
report_error_time--;//接着获取邋completeDeviceName 7次
if(!report_error_time)
{
AfxMessageBox("Get USB DeviceFileName error over d% times!!!",GetUSBDeviceName_Times);
break;//超过次数 跳出报警
}
}//获取不成功的支线
}//end for i3
}//end while report_error_time
}//正确获得没有重复的completeDeviceName
}//换个USBDevice_Names[i2]继续比较,直到都不重复
memcpy(USBDevice_Names[i],completeDeviceName,sizeof(completeDeviceName));
break;
} //有空位的地方
}//end for i
}//最外面的IF ELSE结尾
return 1;
}//只增不减
=====================================================第一次优化把查空函数提前了
后来的改造
{
int i;
int i2;
int i3;
for(i=0;i<MAX_USB_Device+1;i++)
{
if(USBDevice_Names[i][0]=='/0')
{
GETname:
for (i3=0;i3<MAX_USB_Device+1;i3++)
{
if ( !GetUsbDeviceFileName(
(LPGUID) &GUID_CLASS_I82930_BULK,
completeDeviceName,i3) )
{
AfxMessageBox("usb不能找到名字!!");
return 0;
break;
}
else
{
for(i2=0;i2<MAX_USB_Device+1;i2++)
{
if(strcmp(USBDevice_Names[i2],completeDeviceName)==0)
{
goto GETname;
}
}
memcpy(USBDevice_Names[i],completeDeviceName,sizeof(completeDeviceName));
break;
}
}
}
if(i==8)
AfxMessageBox("最大连接数超出 !!");
}//?òμ?óD??μ?i ?-?·
return 1;
}
=====================================================================第二次优化
{
int i;
int i2;
int i3;
BOOL infor=0;
for(i=0;i<MAX_USB_Device+1;i++)
{
if(USBDevice_Names[i][0]=='/0')
{
for (i3=0;i3<MAX_USB_Device+1;i3++)
{
infor=0;
if ( !GetUsbDeviceFileName(
(LPGUID) &GUID_CLASS_I82930_BULK,
completeDeviceName,i3) )
{
AfxMessageBox("usb不能找到名字!!");
return 0;
break;
}
else
{
for(i2=0;i2<MAX_USB_Device+1;i2++)
{
if(strcmp(USBDevice_Names[i2],completeDeviceName)==0)
{
infor=1;
continue;
}
}
if(infor) continue;
memcpy(USBDevice_Names[i],completeDeviceName,sizeof(completeDeviceName));
return 1;
}
}
}
if(i==8)
AfxMessageBox("超出最大连接数!!");
}//?òμ?óD??μ?i ?-?·
============================
GetUsbDeviceFileName 函数中
....
SetupDiDestroyDeviceInfoList (hardwareDeviceInfo);
// free ( *UsbDevices );
*UsbDevices = NULL;
UsbDevices = NULL;
return hOut;
妈的一free 就乱跑,还得哥们弊掉它,直接用空指针算了!
=========================================极了,总是出错,看来再简单一些,第三次优化!!!最简单版本
{
int i;
int i2;
BOOL infor=0;
for(i=0;i<MAX_USB_Device+1;i++)
{
if(USBDevice_Names[i][0]=='/0')
{
if ( !GetUsbDeviceFileName(
(LPGUID) &GUID_CLASS_I82930_BULK,
completeDeviceName,i3) )
{
AfxMessageBox("usb没找到名字!!");
//return 0;
break;
}
else
{
check:
for(i2=0;i2<MAX_USB_Device+1;i2++)
{
if(strcmp(USBDevice_Names[i2],completeDeviceName)==0)
{
i3++;
GetUsbDeviceFileName( (LPGUID) &GUID_CLASS_I82930_BULK, completeDeviceName,i3) ;
goto check;
//infor=1;
//continue;
}
}
}
//if(infor) continue;
memcpy(USBDevice_Names[i],completeDeviceName,sizeof(completeDeviceName));
return 1;
}
if(i==8)
AfxMessageBox("超过最大连接数!!");
}//
}