2010-06-09 9 views
0

Pour obtenir le GUID du volume i essayé le code comme ci-dessousGetVolumeNameForVolumeMountPoint retourne false

int len = wcslen(pDetData->DevicePath); 
pDetData->DevicePath[len] = '\\'; 
pDetData->DevicePath[len+1] = 0; 
#define BUFFER_SIZE MAX_PATH 
WCHAR volume[BUFFER_SIZE]; 
BOOL bFlag; 
bFlag = GetVolumeNameForVolumeMountPoint(pDetData->DevicePath, volume, BUFFER_SIZE); 
int loginErrCode = GetLastError(); 
printf("loginErrCode: %d\n", loginErrCode); 
printf("BFLAG: %d\n", bFlag); 

le GetLastError() elle imprime également 1. cela signifie ERROR_INVALID_FUNCTION. Le bFlag renvoie toujours zéro, cela signifie faux.

quel est le problème dans mon code ...

+1

En supposant que ceci soit un autre dans votre ligne de questions, vous ne pouvez pas utiliser le périphérique USB (GUID_DEVINTERFACE_USB_DEVICE) avec GetVolumeNameForVolumeMountPoint; cette fonction ne fonctionne qu'avec des périphériques de volume (GUID_DEVINTERFACE_VOLUME). – Luke

Répondre

1

Cela nécessite une consultation-boule de cristal. La chaîne DevicePath semble provenir de SP_DEVICE_INTERFACE_DETAIL_DATA. C'est une chaîne que vous ne possédez pas, la modifier corrompt au mieux la base de données interne de setupapi, le tas au pire. Vous devrez copier la chaîne dans votre propre tampon avant de le convertir dans le nom du répertoire racine.

Ceci est juste une théorie, en particulier "loginErrCode" est un nom très étrange pour ce que le code semble faire. Vérifiez que la chaîne avec laquelle vous vous trouvez ressemble au moins à "F: \".

+0

SP_DEVICE_INTERFACE_DETAIL_DATA est sauvegardé par un tampon fourni par l'utilisateur, donc le modifier est correct (tant qu'il est assez grand). – Luke

+0

Bon point. D'accord, tassez la corruption alors. –