2010-08-06 5 views
4

Je travaille sur l'obtention de l'ID du périphérique du périphérique USB i fiche ...msdn CM_GET_Parent exemple ne fonctionne pas

L'application ci-dessus fonctionne sur win-Xp mais pas dans Windows 7

Quand je essayez de comprendre que je l'ai trouvé CM_Get_Parent() ne travaille pas ...

quelqu'un peut-il s'il vous plaît me guider pourquoi sa ne fonctionne pas ... et est-il compatible avec la fonction qui peut fonctionner sur windows 7

code source

:

HDEVINFO hDevInfo; 
GUID guid; 
BYTE buffer[ 1024 ]; 
DWORD dwRequiredSize ; 
WCHAR buf[ 1024 ]; 
DEVINST devInstParent; 
WCHAR volume[1024]; 
int aLength, anIndex; 
SP_DEVICE_INTERFACE_DATA devInterfaceData; 
SP_DEVINFO_DATA devInfoData; 
PSP_DEVICE_INTERFACE_DETAIL_DATA pDevDetail; 

guid = GUID_DEVINTERFACE_VOLUME; 
hDevInfo = SetupDiGetClassDevs(&guid, NULL, NULL, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT); 

if(hDevInfo == INVALID_HANDLE_VALUE) 
{ 
    qDebug() << "Error - SetupDiGetClassDevs failed\n"; 
} 

for(DWORD dwIndex = 0;; dwIndex ++) 
{ 
    ZeroMemory(&devInterfaceData, sizeof(devInterfaceData)); 
    devInterfaceData.cbSize = sizeof(devInterfaceData); 
    if(!SetupDiEnumDeviceInterfaces(hDevInfo, NULL, &guid,dwIndex, &devInterfaceData)) 
    { 
     break; 
    } 

    ZeroMemory(&devInfoData, sizeof(devInfoData)); 
    devInfoData.cbSize = sizeof(devInfoData); 

    pDevDetail = (PSP_DEVICE_INTERFACE_DETAIL_DATA)buffer; 
    pDevDetail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); 

    // Get device interface detail data to get Device Instance from 
    // SP_DEVINFO_DATA and Device Path from SP_DEVICE_INTERFACE_DETAIL_DATA 
    SetupDiGetDeviceInterfaceDetail(
     hDevInfo,&devInterfaceData, 
     pDevDetail, // SP_DEVICE_INTERFACE_DETAIL_DATA 
     1024,&dwRequiredSize,&devInfoData); // SP_DEVINFO_DATA 

    CM_Get_Parent(&devInstParent,devInfoData.DevInst, 0); 
    CM_Get_Parent(&devInstParent,devInstParent, 0); 
    CM_Get_Device_ID( devInstParent, buf, 1024,0); 
} 
+1

Il y a quelque temps, je vous ai posté un exemple de code sur http://stackoverflow.com/questions/3098696/how-to-get-the-vid-pid-and-drive-letter-for -tout-le-usb-mass-storage-devices-plug qui utilise 'CM_Get_Parent' et que j'ai testé sous Windows 7. Donc si vous avez un exemple où la fonction' CM_Get_Parent() 'ne fonctionne pas, vous devriez poster l'exemple de code correspondant peut être utilisé pour reproduire le problème. – Oleg

Répondre

2

qui suit un code modifié Litle

#include <Windows.h> 
#include <setupapi.h> 
#include <cfgmgr32.h> 
#include <tchar.h> 
#include <stdio.h> 
#define ARRAY_SIZE(arr)  (sizeof(arr)/sizeof(arr[0])) 

#pragma comment (lib, "setupapi.lib") 

int main() 
{ 
    HDEVINFO hDevInfo; 
    GUID guid; 
    BYTE buffer[ 1024 ]; 
    DWORD dwRequiredSize ; 
    DEVINST devInstParent; 
    SP_DEVICE_INTERFACE_DATA devInterfaceData; 
    SP_DEVINFO_DATA devInfoData; 
    PSP_DEVICE_INTERFACE_DETAIL_DATA pDevDetail; 
    CONFIGRET status; 
    TCHAR szDeviceInstanceID [MAX_DEVICE_ID_LEN]; 
    BOOL bSuccess; 

    guid = GUID_DEVINTERFACE_VOLUME; 
    hDevInfo = SetupDiGetClassDevs(&guid, NULL, NULL, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT); 
    if(hDevInfo == INVALID_HANDLE_VALUE) { 
     return 1; 
    } 

    for(DWORD dwIndex = 0;; dwIndex ++) { 
     ZeroMemory(&devInterfaceData, sizeof(devInterfaceData)); 
     devInterfaceData.cbSize = sizeof(devInterfaceData); 

     if(!SetupDiEnumDeviceInterfaces(hDevInfo, NULL, &guid, dwIndex, &devInterfaceData)) { 
      DWORD dwErrorCode = GetLastError(); 
      if (dwErrorCode == ERROR_NO_MORE_ITEMS) 
       break; 
      else 
       return 1; // ERROR!!! 
     } 

     ZeroMemory(&devInfoData, sizeof(devInfoData)); 
     devInfoData.cbSize = sizeof(devInfoData); 
     pDevDetail = (PSP_DEVICE_INTERFACE_DETAIL_DATA)buffer; 
     pDevDetail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); 

     // Get device interface detail data to get Device Instance from 
     // SP_DEVINFO_DATA and Device Path from SP_DEVICE_INTERFACE_DETAIL_DATA 
     bSuccess = SetupDiGetDeviceInterfaceDetail(hDevInfo,&devInterfaceData, 
       pDevDetail,// SP_DEVICE_INTERFACE_DETAIL_DATA 
       sizeof(buffer),&dwRequiredSize,&devInfoData); // SP_DEVINFO_DATA 
     status = CM_Get_Device_ID (devInfoData.DevInst, szDeviceInstanceID, ARRAY_SIZE(szDeviceInstanceID), 0); 
     if (status == CR_SUCCESS) { 
      _tprintf (TEXT("%s\n"), szDeviceInstanceID); 
     } 

     status = CM_Get_Parent(&devInstParent,devInfoData.DevInst, 0); 
     if (status == CR_SUCCESS) { 
      status = CM_Get_Device_ID (devInstParent, szDeviceInstanceID, ARRAY_SIZE(szDeviceInstanceID), 0); 
      if (status == CR_SUCCESS) 
       _tprintf (TEXT(" %s\n"), szDeviceInstanceID); 

      status = CM_Get_Parent(&devInstParent,devInstParent, 0); 
      if (status == CR_SUCCESS) { 
       status = CM_Get_Device_ID( devInstParent, szDeviceInstanceID, ARRAY_SIZE(szDeviceInstanceID), 0); 
       if (status == CR_SUCCESS) { 
        _tprintf (TEXT("  %s\n"), szDeviceInstanceID); 
       } 
      } 
      else { 
       continue; 
      } 
     } 
     else { 
      continue; 
     } 
    } 
} 

travail sans aucun problème sur mon ordinateur Windows 7 et produire une sortie comme suit:

SCSI\CDROM&VEN_ELBY&PROD_CLONEDRIVE&REV_1.4\1&2AFD7D61&0&000000 
    ROOT\SCSIADAPTER\0000 
     HTREE\ROOT\0 
STORAGE\VOLUME\{21C004DA-0EB2-11DF-8C02-806E6F6E6963}#0000000000100000 
    ROOT\VOLMGR\0000 
     HTREE\ROOT\0 
STORAGE\VOLUME\{21C004DA-0EB2-11DF-8C02-806E6F6E6963}#000000004B100000 
    ROOT\VOLMGR\0000 
     HTREE\ROOT\0 
STORAGE\VOLUME\{21C004DA-0EB2-11DF-8C02-806E6F6E6963}#00000037C7A00000 
    ROOT\VOLMGR\0000 
     HTREE\ROOT\0 

MISE À JOUR basé sur le commentaire: Le mon Windows XP dans le même utilitaire VMware produire la sortie suivante

FDC\GENERIC_FLOPPY_DRIVE\6&1435B2E2&0&0 
    ACPI\PNP0700\5&324D5432&0 
     ACPI\PNP0A05\4&5289E18&0 
IDE\CDROMNECVMWAR_VMWARE_IDE_CDR10_______________1.00____\3031303030303030303030303030303030303130 
    PCIIDE\IDECHANNEL\4&23686003&0&1 
     PCI\VEN_8086&DEV_7111&SUBSYS_197615AD&REV_01\3&61AAA01&0&39 
STORAGE\VOLUME\1&30A96598&0&SIGNATURE91929192OFFSET7E00LENGTH1FFD5AA00 
    ROOT\FTDISK\0000 
     HTREE\ROOT\0 

Cause C'est un autre ordinateur (un ordinateur virtuel) sur l'autre système d'exploitation et nous recevons une autre liste de périphériques. Votre question actuelle était de faire fonctionner la fonction CM_Get_Parent() sur Windows XP et Windows 7. Le code affiché fait cela comme nous pouvons le voir. Ou il fonctionne maintenant correctement sur votre ordinateur Windows XP ou Windows 7?

Comment obtenir pid et vid (id produit et id Ventor) je l'ai décrit dans Get information about disk drives result on windows7 - 32 bit system, mais pour toutes les lettres de lecteur et non pour les appareils de volume . On peut facilement changer le code pour afficher plus d'informations comme le nom du volume, le nom du bus et d'autres informations. Mais tout cela est déjà une autre question.

MISE À JOUR: J'ai placé la version étendue du programme de Get information about disk drives result on windows7 - 32 bit system sous http://www.ok-soft-gmbh.com/ForStackOverflow/EnumMassStorage.c en raison de la restriction de la taille du message dans stackoverflow.com. La sortie du test ressemble à http://www.ok-soft-gmbh.com/ForStackOverflow/EnumMassStorage.txt

+0

@barbgal: Le code est-il exécuté sur vos ordinateurs Windows 7 et Windows XP? Avez-vous encore des problèmes avec 'CM_Get_Parent()'? – Oleg

Questions connexes