Je voudrais essayer d'extraire location information
du dispositif USB (le même que dans le gestionnaire de périphériques) ... Je ne suis pas le code dans C# ni WMI mais vous devriez être en mesure d'obtenir cette genre d'info avec setupapi.h
qui fait partie de winapi (je pense) je le fais comme ça dans C++/VCL:
#include <setupapi.h>
bool USBinfo()
{
int i,n;
AnsiString s,txt="";
DWORD dwSize,dwPropertyRegDataType;
HDEVINFO hDevInfo;
SP_DEVINFO_DATA DeviceInfoData;
TCHAR szDesc[1024];
// List all connected USB devices
hDevInfo = SetupDiGetClassDevs(NULL, TEXT("USB"), NULL, DIGCF_PRESENT|DIGCF_ALLCLASSES);
if (hDevInfo == INVALID_HANDLE_VALUE) return false;
for (i=0;;i++)
{
DeviceInfoData.cbSize = sizeof(DeviceInfoData);
if (!SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData)) break;
SetupDiGetDeviceRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_DEVICEDESC,&dwPropertyRegDataType, (BYTE*)szDesc,sizeof(szDesc),&dwSize);
s=szDesc; n=48; while (s.Length()<n) s+=" "; if (s.Length()>n) s=s.SubString(1,n); txt+=s+" "; // this just set constant string size to allign the columns to n chars
SetupDiGetDeviceRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_HARDWAREID,&dwPropertyRegDataType, (BYTE*)szDesc,sizeof(szDesc),&dwSize);
s=szDesc; if (s=="USB\\VID_????&PID_????REV_????")
{
// here you can do custom stuff for specific VID,PID just change the ???? in above line to your specific VID,PID,REV
}
s=szDesc; n=64; while (s.Length()<n) s+=" "; if (s.Length()>n) s=s.SubString(1,n); txt+=s+" ";
SetupDiGetDeviceRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_LOCATION_INFORMATION,&dwPropertyRegDataType, (BYTE*)szDesc,sizeof(szDesc),&dwSize);
s=szDesc; n=64; while (s.Length()<n) s+=" "; if (s.Length()>n) s=s.SubString(1,n); txt+=s+" ";
txt+="\r\n";
}
Main->mm_log->Lines->Add(txt); // this just output txt string to memo
return true;
}
ici sortie sur ma machine:
USB Root Hub USB\ROOT_HUB&VID1022&PID7807&REV0011 USB\ROOT_HUB&VID1022&PID7807&REV0011
USB Root Hub USB\ROOT_HUB&VID1022&PID7807&REV0011 USB\ROOT_HUB&VID1022&PID7807&REV0011
USB Root Hub USB\ROOT_HUB&VID1022&PID7809&REV0011 USB\ROOT_HUB&VID1022&PID7809&REV0011
USB Root Hub USB\ROOT_HUB20&VID1022&PID7808&REV0011 USB\ROOT_HUB20&VID1022&PID7808&REV0011
USB Root Hub USB\ROOT_HUB20&VID1022&PID7808&REV0011 USB\ROOT_HUB20&VID1022&PID7808&REV0011
USB Composite Device USB\VID_048D&PID_9006&REV_0200 Port_#0001.Hub_#0004
IT9135 BDA Device USB\VID_048D&PID_9006&REV_0200&MI_00 0000.0013.0002.001.000.000.000.000.000
USB Input Device USB\VID_048D&PID_9006&REV_0200&MI_01 0000.0013.0002.001.000.000.000.000.000
Canon LiDE 30 USB\VID_04A9&PID_220E&REV_0100 Port_#0005.Hub_#0001
American Power Conversion USB UPS USB\VID_051D&PID_0002&REV_0106 Port_#0001.Hub_#0001
USB Input Device USB\Vid_093A&Pid_2510&Rev_0100 USB Optical Mouse
USB Input Device USB\VID_413C&PID_2107&REV_0115 Port_#0002.Hub_#0001
Comme vous pouvez le voir la dernière colonne (3ième) contient l'information que vous voulez. Regardez à l'intérieur setupapi.h
pour tous les SPDRP_
définit que vous pouvez utiliser ... La seule chose utilisée de VCL est AnsiString
alors changez-le à n'importe quel type de chaîne que vous avez à votre disposition. Ce numéro n'est pas limité à USB. Si vous voulez que tous les appareils changent alors paramètre TEXT("USB")
de recherche pour NULL
hDevInfo = SetupDiGetClassDevs(NULL, NULL, NULL, DIGCF_PRESENT|DIGCF_ALLCLASSES);
J'ai aussi essayé l'approche similaire. La sortie que vous avez montrée ici montre DeviceID pour chaque périphérique présent sous les contrôleurs USB dans DeviceManager. Cependant, je suis à la recherche des détails de localisation exacte du gestionnaire de périphériques. Les détails de l'emplacement s'affichent sous la forme Port_ # 0003.Hub_ # 0003. Mais ici, il montre juste VID, PID & REV qui n'aidera pas à identifier le numéro de slot de l'USBHub. –
@RahulAnand rouler la barre de défilement vers la droite les emplacements sont après la colonne PID VID comme 'Port_ # 0005.Hub_ # 0001' – Spektre
@Spektre ... Merci de fournir une approche d'analyse correcte. Bien que j'aie essayé d'utiliser C# mais je n'arrive toujours pas à trouver la propriété Location correctement. Je travaille toujours dessus. Mais en effet, c'est l'approche de solution correcte que vous avez fournie. Cela m'a vraiment aidé. –