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 :

Ejecter une clé USB de façon sûre


Sujet :

API, COM et SDKs Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Par défaut Ejecter une clé USB de façon sûre
    Bonjour,

    J'essaie tant bien que mal d'éjecter un volume (clé USB) de façon sûre comme si l'on passé par l'icône dans le systray :Retirer le périphérique en toute sécurité.

    Pour ce faire, j'utilise le travail de SergioMaster cependant, j'ai un petit soucis
    Il ne reconnait pas la fonction CM_Request_Device_Eject ...
    J'ai pourtant bien déclaré mes uses et j'ai téléchargé les win32api mais rien n'y fait... De plus, d'après ma traduction, il est désormais plus judicieux d'utiliser les JEDI API Windows Headers (JWAPI).

    J'avoue être un peu dépassé bien que j'ai cherché ...
    Une petite aide serait la bienvenue
    J'utilise XP Pro SP2
    Merci

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 598
    Billets dans le blog
    65
    Par défaut
    Salut ,
    mon programme 'tournant' avec avec ce qui était indiqué dans le post je ne suis pas allé plus loin . Pour ce qui est des JWAPI je vais me pencher dessus ce w.e., je n'étais pas au courant

    par contre je ne me souviens pas avoir utilisé CM_Request_Device_Eject
    dans l'unité ejection

  3. #3
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Par défaut
    Salut SergioMaster

    Merci de te pencher sur le soucis également...
    J'ai vraiment envie de finaliser la chose étant donné que j'aimerai inclure cette partie dans mon compo gérant l'insertion et le retrait de volumes

    En ce qui concerne CM_Request_Device_Eject, je confirme, tu l'as bien utilisé
    Si j'ai le temps ce week, je regarderai encore...

    A+

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 598
    Billets dans le blog
    65
    Par défaut
    Exact ! Bien fait pour moi
    CM_Request_Device_Eject, je l'utilise bien , voilà ce que c'est de travailler sur plusieurs postes

    cette fonction doit se trouver dans un des apports de JVCL
    -> cfgMgr32.pas pour être exact


    quant a la JWAPI je suis en train d'en lire la derniere version

    modif :

    cfg,setupAPI et cfgMgr32 se trouve dans jwapi\trunc\SaCMAPI

    (petite note , pour faire la fonction je n'ai installé aucun paquets, mias juste copié les éléments sources 'nécessaires' :
    cfg.pas,cfgmgr32.pas,setupApi,jwaWinBase
    je ne suis même pas sur qu'il soit tous nécessaires )



    nota : j'ai suivi avec intérêt tes travaux sur l'USB

  5. #5
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Par défaut
    Hello !

    Ca y est
    Tout fonctionne désormais
    Merci pour ton aide, (au passage, je n'avais pas eu le temps de m'y replonger hier).
    Bon, ba voilà, je vais pouvoir ajouter ça à mon compo avec en plus l'éjection de CD

    Le petit soucis (enfin, je pense ... à tester), ce sera avec les lecteurs de cartes SD ...
    En effet, si l'on passe par l'arrêt via le systray, il me déconnecte carrément mon lecteur USB (logiquement me direz vous). Il me faudra donc faire une simple éjection ...
    Tout ceci n'est qu'hypothèse et donc se doit d'être vérifié Je ferai des tests lorsque j'aurai un peu plus de temps!

    En attendant, encore merci
    A+

  6. #6
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Par défaut
    Salut,

    Je me permet d'utiliser ce thread pour poser ma question sur l'éjection de CD/DVD ...
    Je suis allé faire un tour dans la FAQ afin de voir si une telle fonction existait, et j'ai trouvé . Cependant, il y a un hic ... Lorsque j'utilise la fonction de la FAQ, j'ai une erreur de ce style :

    Le projet Project1.exe a provoqué une classe d'exception EAccessViolation avec le message 'Violation d'accès à l'adresse 7C923022 dans le module 'ntdll.dll'. Ecriture de l'adresse 0000000E'. Processus stoppé. Utilisez Pas-à-pas ou Exécuter pour continuer.
    D'après mes recherches, c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mciGetErrorString(Error, ErrorText, LenghtBuffer);
    qui pose soucis.

    J'ai donc modifié la fonction ainsi :
    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
    function OpenCD(Drive: Char): Boolean;
    var
      Error: MciError;
      OpenParm: TMCI_Open_Parms;
      Flags: DWORD;
      DeviceLetter: string;
      DeviceID: Word;
    begin
      Result := False;
      DeviceLetter := Drive + ':';
      Flags  := MCI_OPEN_TYPE or MCI_OPEN_ELEMENT;
      with OpenParm do
      begin
        dwCallback := 0;
        lpstrDeviceType := 'CDAudio';
        lpstrElementName := PChar(DeviceLetter);
      end;
      Error := mciSendCommand(0, MCI_OPEN, Flags, Longint(@OpenParm));
      if Error <> 0 then Exit;
      DeviceID := OpenParm.wDeviceID;
      try
        Error := mciSendCommand(DeviceID, MCI_SET, MCI_SET_DOOR_OPEN, 0);
        if Error <> 0 then Exit;
        Result := True;
      finally
        mciSendCommand(DeviceID, MCI_CLOSE, Flags, Longint(@OpenParm));
      end;
    end;
    Voilà
    A+

  7. #7
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 132
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 132
    Par défaut
    Salut !

    Moi aussi j'ai modifié le code, mais afin de ne pas virer la fonction qui t'a posé problème, j'ai plutôt rajouté ce qui manquait afin que ça ne plante plus,
    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
    function OpenCD(Drive: String): Boolean;
    var
      OpenParm: TMCI_Open_Parms;
      Flags: DWord;
      DeviceID : Word;
      Error: MciError;
      ErrorText: PChar;
      LenghtBuffer: Cardinal;
    begin
      Result := False;
      LenghtBuffer := 255; // !
      try // !
        GetMem(ErrorText, LenghtBuffer); // !
        Flags := mci_Open_Type or mci_Open_Element;
        with OpenParm do begin
          dwCallback := 0;
          lpstrDeviceType := 'CDAudio';
          lpstrElementName := PChar(Copy(Drive, 0, 2));
        end;
        Error := mciSendCommand(0, mci_Open, Flags, Longint(@OpenParm));
        mciGetErrorString(Error, ErrorText, LenghtBuffer);
        if Error = 0 then
          DeviceID := OpenParm.wDeviceID
        else
          raise EAccessViolation.Create(ErrorText);
        try
          Error := mciSendCommand(DeviceID, MCI_SET, MCI_SET_DOOR_OPEN, 0);
          mciGetErrorString(Error, ErrorText, LenghtBuffer);
        finally
          mciSendCommand(DeviceID, mci_Close, Flags, Longint(@OpenParm));
        end;
          if Error = 0 then
            Result := True
          else
            raise EAccessViolation.Create(ErrorText);
      finally // !
        FreeMem(ErrorText, LenghtBuffer); // !
      end;  // !
    end;
    Valà !
    --
    jp

  8. #8
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Par défaut
    Salut cher Jipété

    Je te remercie pour ce code.
    Je n'avais pas chercher à corriger la fonction, j'ai viré ce qui posait soucis dans un premier temps afin de faire simple.

    Bonne journée à toi
    Cordialement

  9. #9
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 598
    Billets dans le blog
    65
    Par défaut


    pour l'éjection d'un CD tu peut aussi utiliser ceci , sans plus
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    mciSendString('Set cdaudio door open wait', nil, 0, handle);
    je ne sais pas pourquoi ça marche mais en tout cas beton je l'utilise régulièrement pour ejecter mes CD sur un portable qui n'as pas la touche d'éjection facile

  10. #10
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Par défaut
    Salut,

    Citation Envoyé par SergioMaster Voir le message


    pour l'éjection d'un CD tu peut aussi utiliser ceci , sans plus
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    mciSendString('Set cdaudio door open wait', nil, 0, handle);
    je ne sais pas pourquoi ça marche mais en tout cas beton je l'utilise régulièrement pour ejecter mes CD sur un portable qui n'as pas la touche d'éjection facile
    Je suis d'accord avec toi, mais moi, j'ai deux lecteurs et lorsque j'utilise cette fonction, je ne peux qu'ouvrir le premier ... C'est pour cela que je me suis penché sur plus compliqué

    A moins que ce que je dise ne soit que bêtise ...
    A+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [.Net 2.0] Ejecter une clé usb
    Par Xploit dans le forum C#
    Réponses: 2
    Dernier message: 20/10/2011, 09h56
  2. Ejecter une clef usb
    Par hugoclo dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 14/02/2010, 18h32
  3. Ejecter une clé usb
    Par Hemophilius dans le forum Visual C++
    Réponses: 1
    Dernier message: 24/08/2009, 00h43
  4. Ejecter une clef usb
    Par Baxter67 dans le forum C++Builder
    Réponses: 8
    Dernier message: 27/03/2008, 11h29
  5. Ejecter une clé USB et détecter sa deconnexion
    Par Cederic dans le forum VBScript
    Réponses: 6
    Dernier message: 22/02/2008, 17h04

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