[windows win32] notification d'insertion et éjection de clés usb

notification d'insertion et éjection de clés usb [windows win32] - C - Programmation

Marsh Posté le 15-04-2005 à 15:02:41    

Salut,
 
 
je travaille sur un outil de duplication de divers périphériques amovibles se branchant sur le port usb (clé usb, divers cartes mémoire et autre), et je cherche à savoir comment forcer l'ejection d'un périphérique (sans avoir a passer par l'icone ejecter dans la barre des taches), et egalement je cherche à récuperer les événements ou messages windows me signalant l'insertion/la suppression d'un support amovible pour mettre à jour automatiquement ma liste (sans avoir à mettre un bouton rafraichir).
 
J'ai cherché dans la documentation MSDN de microsoft, mais celle ci est assez mal documentée et je n'ai pas trouvé d'informations utiles à ce sujet.
 
 
Merci d'avance :)
 
 
 
 

Reply

Marsh Posté le 15-04-2005 à 15:02:41   

Reply

Marsh Posté le 15-04-2005 à 15:10:15    

Reply

Marsh Posté le 15-04-2005 à 15:20:42    

merci c est sympa, je vais regarder ca :)
 
 
J'ai trouvé quelque chose pour forcer l'éjection dans la MSDN :  


HOWTO: Ejecting Removable Media in Windows NT
Last reviewed: March 25, 1997
Article ID: Q165721  


 
avec du code permettant d  ejecter un périphérique amovible, mais j'ai essayé d utiliser ce code et ca n ejecte pas du tout mon disque. Peut etre parcequ'il s'agit de vieux code prévu pour windows NT et que la procédure sous windows XP est différente ? je vais regarder un peu plus en détail.

Reply

Marsh Posté le 15-04-2005 à 16:43:17    

Je crois que l'éjection c'est pour des trucs genre les lecteurs Zip qui physiquement éjectent un disque.
Toi tu veux déconnecter un périph USB. A priori, je regarderais plutôt du côté de la Setup API.
http://msdn.microsoft.com/library/ [...] gement.asp
y'a peut etre plus direct, mais si le code que tu cites ne marche pas, je vois rien d'autre.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 19-04-2005 à 10:20:05    

effectivement ca doit etre ca, d'ailleurs quand on fait a partir de l'explorateur windows "bouton droit -> ejecter" sur une clé usb, ca ne marche pas (ca fait rien). Il faut ejecter le périphérique en passant par l'icone en bas a droite.
 
Je pense donc que la portion de code que j'ai ne fonctionnera pas sur les clés usb :(
 
Par contre je n'ai pas trouvé grand chose qui puisse m'aider dans le lien que tu m'as passé. Je te remercie quand meme pour tes réponses :)

Reply

Marsh Posté le 19-04-2005 à 11:18:00    

en cherchant un peu plus, j'ai trouvé une partie de code qui peut etre interessante :
 

Code :
  1. #include <windows.h>
  2. #include <SetupAPI.h>
  3. #include <cfgmgr32.h>
  4. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE PrevInstance, LPSTR CmdLine, int CmdShow)
  5. {
  6. int res = 0;
  7. char buffer[20];
  8. char* hid = "USB\\Vid_05e3&Pid_0702\\5&2cab1e4d&0&1";
  9. HMACHINE hMachine = NULL;
  10. DEVINST dnDevInst = NULL;
  11. PDEVINST pdnDevInst_OUT = &dnDevInst;
  12. res = CM_Locate_DevNode_Ex(pdnDevInst_OUT, hid, CM_LOCATE_DEVNODE_NORMAL, hMachine);
  13. _itoa(res, buffer, 10);
  14. //MessageBox(NULL, buffer, "msg", 0);
  15. res = CM_Request_Device_Eject_Ex(dnDevInst, NULL, NULL, 0, 0, hMachine );
  16. _itoa(res, buffer, 10);
  17. //MessageBox(NULL, buffer, "msg", 0);
  18. return 0;
  19. }


 
 
Apparemment, il est possible d'ejecter un periphérique en passant par la Setup API comme tu me l'as proposé.  
 
Il me reste donc à trouver le moyen de faire la correspondance entre mon lecteur ('F:' par exemple) et le périphérique associé, et également savoir si un périphérique est éjectable ou non.  
 

Reply

Marsh Posté le 19-04-2005 à 11:36:57    

Voir GetDriveType() / GetVolumeNameForVolumeMountPoint().
T'es sûr que FSCTL_DISMOUNT_VOLUME ça marche pas ?


Message édité par HelloWorld le 19-04-2005 à 11:38:33

---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 19-04-2005 à 14:29:18    

j'ai intercepté le message WM_DEVICECHANGE et mis un point d arret dessus.
 
Lorsque je fais appel a FCNTL_DISMOUNT_VOLUME, je n'atteins pas le point d'arret, et d'ailleurs mon disque est tjrs accessible a partir de l'explorateur (comme si ca n'avait rien fait en fait).
 
Par contre, si je deconnecte le périphérique en passant par l'icone de gestion de périphériques, j'intercepte bien le message WM_DEVICECHANGE.
 
Je pense donc qu'il faut que j'utilise la partie de code que j'ai postée.
 
Le gros problème est que je viens de m'apercevoir qu'il faut le DDK pour utiliser ces fonctions et je ne l'ai pas (et il est payant  :cry: ). J'ai juste le DDK pour NT4 (je suis sous windows XP) , et apparemment ca ne fonctionne pas avec.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed