IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

API, COM et SDKs Delphi Discussion :

Déconnexion d'un périphérique USB par le code


Sujet :

API, COM et SDKs Delphi

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    158
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 158
    Points : 158
    Points
    158
    Par défaut Déconnexion d'un périphérique USB par le code
    Bonjour à tous ,

    Connaîtriez vous un moyen de déconnecter proprement un périphérique
    USB, par code ?

    Merci
    Pitango
    -------------------------------------------------
    [Delphi7.1 Entreprise][MYSQL 5.0.27][SQL SERVER 7][W2000/NT4]

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    158
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 158
    Points : 158
    Points
    158
    Par défaut
    Bonjour,

    J'ai bien trouvé l'utilitaire microsoft devcon,

    http://support.microsoft.com/kb/311272/fr.

    mais je me retrouve toujours avec un message de ce type

    "suppression de périphérique hasardeuse....."

    Peux être avez vous une autre idée ?

    A+
    Images attachées Images attachées  
    Pitango
    -------------------------------------------------
    [Delphi7.1 Entreprise][MYSQL 5.0.27][SQL SERVER 7][W2000/NT4]

  3. #3
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Google.fr est ton ami :

    http://www.developpez.net/forums/showthread.php?t=53391

    Ce code devrait te mettre sur la piste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    unit USB_D;
     
    interface
     
    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, StdCtrls;
     
    type
     
    PDEV_BROADCAST_HDR = ^TDEV_BROADCAST_HDR;
    TDEV_BROADCAST_HDR = packed record
    dbch_size : DWORD;
    dbch_devicetype : DWORD;
    dbch_reserved : DWORD;
    end;
     
    PDEV_BROADCAST_VOLUME = ^TDEV_BROADCAST_VOLUME;
    TDEV_BROADCAST_VOLUME = packed record
    dbcv_size : DWORD;
    dbcv_devicetype : DWORD;
    dbcv_reserved : DWORD;
    dbcv_unitmask : DWORD;
    dbcv_flags : WORD;
    end;
     
    type
    TForm1 = class(TForm)
    Memo1: TMemo;
     
    private
    { Déclarations privées }
    procedure WMDeviceChange(var Msg: TMessage); message WM_DEVICECHANGE;
    public
    { Déclarations publiques }
    end;
     
    var
    Form1: TForm1;
    GetLettre : string;
    implementation
     
    {$R *.dfm}
     
    ///\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
    //
    // Detecter la Connection/Déconnection de périphériques USB de stockage "STORAGE"
    // Mém FLASH, HDD , Mém app photo , MP3...
    //
    // Rylou 27/01/2005 21:44
    //
    ///\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
     
     
    //\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
    // Capture Evenement windows "WMDeviceChange"
    procedure TForm1.WMDeviceChange(var Msg: TMessage);
    var
    VolName, FileSysName : Array[0..Max_Path]Of Char;
    VolSerial, FileMaxLen, FileFlags : DWord;
    S : string;
    begin
    //\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
    // TESTER si DBT_DEVICEARRIVAL = $8000
    // si oui, ne traiter que les périphériques de stockage de type 0=DeviceTypeOEM
    //\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
    if Msg.wParam =$8000 then begin
    if PDEV_BROADCAST_HDR( Msg.LParam )^.dbch_devicetype <>2 then exit;
    if PDEV_BROADCAST_VOLUME( Msg.LParam )^.dbcv_flags <>0 then exit;
     
    // A partir d'ici vous pouvez mettre votre code a executer en cas
    // de connection d'un peripherique de stockage USB.
    // Vous pouvez aussi par exemple comparer le "Non de volume"
    // de ce péripphérique pour affiner le declenchement.
     
    //Affiche dans le textbox les infos du periphérique connécté (pour l'exemple)
    S := 'Connection du périphérique !' +#13+#10+#13+#10;
    // Sa lettre "DeviceID"
    str(ln(PDEV_BROADCAST_VOLUME( Msg.LParam )^.dbcv_unitmask)/ln(2)+Ord('A'):2:0,GetLettre);
    S := S + 'DeviceID :'+#9+#9+ char(strtoint(GetLettre)) + ':\' + #13+#10;
    // NomVolume + SySfichier + N° serie du periphérique
    If GetVolumeInformation(pchar(char(strtoint(GetLettre))+':\'),VolName,Max_Path,@VolSerial,
    FileMaxLen, FileFlags,FileSysName,Max_Path)
    Then S := S +'Nom du Volume :' +#9+#9+ VolName
    +#13+#10'Système de fichiers :' +#9+ FileSysName
    +#13+#10'Numéro de série :' +#9+#9+ IntToStr(VolSerial)+#13+#10;
    // Taille et free espace du periphérique
    S := S + 'Taille totale :' +#9+#9+ FloatToStrF(DiskSize(strtoint(GetLettre)-64)div 1024, ffNumber, 18, 0) + ' Kilo-octets' + #13+#10;
    S := S + 'Disponible :' +#9+#9+ FloatToStrF(DiskFree(strtoint(GetLettre)-64) div 1024, ffNumber, 18, 0) + ' Kilo-octets';
    memo1.text:=S;
    beep; // Envoi un beep sonore a la connection
    end; // Fin de traitement "connection periphérique"
     
     
    //\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
    // TESTER si DBT_DEVICEREMOVECOMPLETE = $8004
    // si oui, ne traiter que les périphériques de stockage de type 0=DeviceTypeOEM
    //\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
    if Msg.wParam =$8004 then begin
    if PDEV_BROADCAST_HDR( Msg.LParam )^.dbch_devicetype <>2 then exit;
    if PDEV_BROADCAST_VOLUME( Msg.LParam )^.dbcv_flags <>0 then exit;
     
    // A partir d'ici vous pouvez mettre votre code a executer en cas
    // de déconnection d'un peripherique de stockage USB.
    // Affiche dans le textbox le periphérique déconnécté (pour l'exemple)
    S := 'Déconnection du périphérique !' +#13+#10+#13+#10;
    // Sa lettre "DeviceID"
    str(ln(PDEV_BROADCAST_VOLUME( Msg.LParam )^.dbcv_unitmask)/ln(2)+Ord('A'):2:0,GetLettre);
    S := S + 'DeviceID :' +#9+#9+ char(strtoint(GetLettre)) + ':\' + #13+#10;
    memo1.text:=S;
    beep; // Envoi un beep sonore a la déconnection
    end; // Fin de traitement "déconnection periphérique"
     
    end;
     
    end.
    De retour parmis vous après 10 ans!!

  4. #4
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Citation Envoyé par pitango
    [IMG]h:\Message.jpg[/IMG]
    Pour ajouter une image sur ton message, celle-ci doit se trouver sur internet (une url), ou alors utilise "gérer les pièces jointes" pour l'ajouter...
    De retour parmis vous après 10 ans!!

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    158
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 158
    Points : 158
    Points
    158
    Par défaut
    Bonjour Sub0,
    Citation Envoyé par sub0
    Pour ajouter une image sur ton message, celle-ci doit se trouver sur internet (une url), ou alors utilise "gérer les pièces jointes" pour l'ajouter..
    Ok je te remercie, c'est corrigé.

    Pour le code que tu m'a envoyé, il est surtout utile pour détecter les changements états, mais sauf erreur de ma part, pas pour "éteindre le périphérique", comme une déconnexion manuelle le ferait.

    Il y a d'ailleurs sur le sujet un post très intéressant

    http://www.developpez.net/forums/sho...&highlight=usb

    Pour revenir à la déconnection, je viens de me rendre compte de mes clients seront W2003 où le problème ne se pose pas.

    Merci pour en tout cas pour la piste.

    Je cherche encore un peu, pour la gestion éventuellement des poste en W2000.

    A+
    Pitango
    -------------------------------------------------
    [Delphi7.1 Entreprise][MYSQL 5.0.27][SQL SERVER 7][W2000/NT4]

  6. #6
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Citation Envoyé par pitango Voir le message
    Pour le code que tu m'a envoyé, il est surtout utile pour détecter les changements états, mais sauf erreur de ma part, pas pour "éteindre le périphérique", comme une déconnexion manuelle le ferait.
    Effectivement, mais l'idée est déjà de savoir quels sont les ports usb où il ya un périphérique connecté et surtout connaître exactement quel est le port que tu souhaites désactivés.

    Pour reste, je pense qu'il suffira de poster le message Windows correspondant à la déconnexion du périphérique. Il s'agit théoriquement du même message qui est généré par Windows lorsqu'on désactive le périphérique manuellement. Le code donné plus haut te permettra donc de savoir quel format de message il faudra pour commander cette déconnexion. Il te permettra aussi de vérifier que celle-ci a bien fonctionné...
    De retour parmis vous après 10 ans!!

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    158
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 158
    Points : 158
    Points
    158
    Par défaut
    OK merci Sub0, pour ton aide.

    Je vais faire dès que j'ai le temps de recherches sur ce message windows.

    A+
    Pitango
    -------------------------------------------------
    [Delphi7.1 Entreprise][MYSQL 5.0.27][SQL SERVER 7][W2000/NT4]

  8. #8
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Et bien il suffit de lancer la démo que je t'ai donné et d'afficher le message correspondant au périphérique que tu déconnectes. Dans la procédure qui détecte l'evènement WMDeviceChange, affiche dans un memo par exemple, les paramètres du message qui est traîté. Il est du type TMessage...

    Finalement, tu te rendras compte qu'il est de toutes façons nécessaire de connaître le port du périphérique que tu souhaites déconnecter avant de pouvoir le faire car d'un pc à l'autre, il se peut qu'il ne soit pas le même. Il faudra donc, au départ, obtenir la liste des périphériques connectés pour connaître le port à traîter, et enfin tu pourras générer le message de déconnexion.
    De retour parmis vous après 10 ans!!

Discussions similaires

  1. Réponses: 5
    Dernier message: 12/11/2010, 12h48
  2. Prise en compte périphériques USB par Virtualbox
    Par mptijr dans le forum VirtualBox
    Réponses: 12
    Dernier message: 23/08/2010, 10h58
  3. Par où commencer pour créer un logiciel pour un périphérique USB ?
    Par bionicleman dans le forum API, COM et SDKs
    Réponses: 2
    Dernier message: 30/01/2009, 21h47
  4. Déconnexion des périphériques USB
    Par Franck.H dans le forum Composants
    Réponses: 5
    Dernier message: 21/11/2007, 17h35
  5. demonter les périphérique USB par la ligne de commande.
    Par Essilife dans le forum Autres Logiciels
    Réponses: 3
    Dernier message: 20/01/2006, 11h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo