Éjecter le cd-rom

Soyez le premier à donner votre avis sur cette source.

Vue 3 543 fois - Téléchargée 502 fois

Description

Titre: Éjecter le CD-ROM
Un exemple de code qui montre comment Éjecter le CD-ROM avec la DLL de Windows 'KERNEL32.DLL'.

Source / Exemple :


unit Unit1;

{
PfA       A0E  ùùùfùNNNN.,M,  0¨¨oMPDMMM   M£,M+yooo¨   ¨AA     o*A   f01HH2M,0   ¨oMM,0oEEMM
ED¨       MM?  I+o       MD,  0oM     M,P  f0o     MM£  MZP     Zll  AND   SC,0o  MMPMMM?ùSùI
¨oM       ùùù  EMM       MCM  £Mf     ?¨£  ùAA     ùoo  o+:     IYd  Ddd  ddEAoE  Eoo
MfM       NN.  A£o       oo+  DP:    ds£   C o    dDd   dYI     ddd  EIZ fEùSùNN  NN.
TISM,0o£MMMM,  odDddIdddEIdd  A£A,,,AP     oddddd;nn      Yn::Y:!*   0¨¨ MPD MMM  £?ù CùZMCM£
PfA       A0E  A£A       ,,,  AP,          ZZY               EE,     ,*,Z,My ,NM          ooo
ED¨       MM?  ooo       +:d  s o          dAA               d¨¨     dd?ùCù  ZEf          ,,,
¨oM       ùùù  SZE       fEù  SùN          .NN              N.,      NM*nY   ddd  dddMM,M+ooo
MfM       NN.  I+o       MD,  0oM          M,P             fY0        f?¨£¨ùAAù   M*M£MZPZ+:d

Titre: Éjecter le CD-ROM
Auteur: H@PPyZERØ5
E-mail: happy05@programmer.net
}

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
const
   {GENERIC_READ = $80000000;
    GENERIC_WRITE = $40000000;} //déjà déclaré dans Windows.pas
    OPEN_EXISTING = 3; //ouvre un fichier ou un périphérique, uniquement si
    //il existe
    INVALID_HANDLE_VALUE = -1; //HANDLE INVALID
    IOCTL_STORAGE_EJECT_MEDIA = 2967560; //Le code de controle pour l'opération
    //EJECT_MEDIA

implementation
{$R *.dfm}

{
les 3 functions sont déjà déclaré dans Windows.pas
<<-------------------------------------------------------------------------->>
//crée ou ouvre un fichier ou un périphérique...
Function CreateFile(
  lpFileName: string;
  dwDesiredAccess: integer;
  dwShareMode: integer;
  lpSecurityAttributes: PSecurityAttributes;
  dwCreationDisposition: integer;
  dwFlagsAndAttributes: integer;
  hTemplateFile: Integer): Integer; //La fonction retourne un handle
  stdcall; external 'KERNEL32.DLL';

//lpFileName: Le nom du fichier ou le périphérique

//dwDesiredAccess: l'accès demandé au fichier ou au périphérique
//GENERIC_READ or GENERIC_WRITE

//dwShareMode: le mode de partage demandée du fichier ou le périphérique

//lpSecurityAttributes: un pointeur vers une TSecurityAttributes

//dwCreationDisposition: une action à effectuer sur un fichier ou un dispositif
//qui existe ou n'existe pas
//pour les périphériques autres que des fichiers, ce paramètre est généralement
//réglé sur OPEN_EXISTING
//OPEN_EXISTING = 3

//dwFlagsAndAttributes: les attributs de fichier ou d'un dispositif et des 
//drapeaux
//...

//hTemplateFile: ce paramètre peut être nil

<<-------------------------------------------------------------------------->>
//envoie un code de controle directement à un pilote de périphérique spécifié...
Function DeviceIoControl(
  hDevice: Integer;
  dwIoControlCode: DWORD;
  lpInBuffer: Pointer;
  nInBufferSize: DWORD;
  lpOutBuffer: Pointer;
  nOutBufferSize: DWORD;
  var lpBytesReturned: DWORD;
  lpOverlapped: POverlapped
  ): Boolean; //La fonction retourne un Boolean
  stdcall; external 'KERNEL32.DLL';

//hDevice: handle de périphérique
//pour récupérer un handle de périphérique, utilisez la fonction CreateFile

//dwIoControlCode: Le code de controle pour l'opération
//utilisez IOCTL_STORAGE_EJECT_MEDIA pour cette opération

//lpInBuffer: non utilisé avec cette opération (nil)

//nInBufferSize: non utilisé avec cette opération (zéro)

//lpOutBuffer: non utilisé avec cette opération (nil)

//nOutBufferSize: non utilisé avec cette opération (zéro)

//lpBytesReturned: un pointeur sur une variable qui reçoit la taille des données
stockées dans la mémoire tampon de sortie...

//lpOverlapped: un pointeur vers un POverlapped

<<-------------------------------------------------------------------------->>
//ferme un handle d'Objet ouvert...
Function CloseHandle(
  hObject: Integer
  ): Boolean; //La fonction retourne un Boolean
  stdcall; external 'KERNEL32.DLL';

//hObject: un handle d'Objet ouvert q'on va fermer

<<-------------------------------------------------------------------------->>
}

{
procedure EjectCD
}
procedure EjectCD(Drive: String);
var
  Path: String;
  HWNDDrive: Integer;
  BytesReturned: DWORD;
  Longueur: Integer;
begin
Longueur := Length(Drive);

   if (Drive[Longueur]) <> ':' then
   Drive :=  Drive + ':';

Path := '\\.\' + Drive; //le nom du périphérique

//en utilise CreateFile pour récupérer le handle de périphérique
HWNDDrive := CreateFile(PChar(path), GENERIC_READ OR GENERIC_WRITE, 0, nil,
  OPEN_EXISTING, 0, 0);//si la fonction échoue, la valeur de retour est 
  //INVALID_HANDLE_VALUE

   //si le périphérique n'existe pas
   if HWNDDrive = INVALID_HANDLE_VALUE then
   Exit; //pour afficher l'error remplacer Exit; par RaiseLastWin32Error;

   try
   BytesReturned := 0;
   if not
   //envoie un code de controle directement à un pilote de périphérique
   DeviceIoControl(HWNDDrive, IOCTL_STORAGE_EJECT_MEDIA, nil, 0, nil, 0, BytesReturned,
      0) then
   Exit; //pour afficher l'error remplacer Exit; par RaiseLastWin32Error;
   finally
   //ferme le handle HWNDDrive
   CloseHandle(HWNDDrive)
   end;

end;

{
<<-------------------------------------------------------------------------->>
}
procedure TForm1.Button1Click(Sender: TObject);
begin
EjectCD(Edit1.Text);
ShowMessage('ejected !!!');
end;

end.

//to be continued...

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
34
Date d'inscription
mardi 1 mai 2012
Statut
Membre
Dernière intervention
7 juillet 2017

j'ai ajouté des commentaires...
Messages postés
1284
Date d'inscription
mardi 28 octobre 2003
Statut
Contributeur
Dernière intervention
3 juillet 2015
12
Salut,

Ce qui serait bienvenu (voire indispensable...), ce serait de commenter le code que tu proposes. Parce qu'il me semblait (mais peut être que je me trompe) que ce site avait pour vocation d'expliquer un peu la programmation. Je doute fort qu'un débutant (niveau indiqué pour ta source) comprenne l'intégralité de ton code... Un peu de pédagogie que diable !!! :)
Par ailleurs, à quoi servent les déclarations de fonctions CreateFileA, DeviceIoControl et CloseHandle ? (CreateFileA n'est d'ailleurs pas utilisé dans EjectCD...) Si c'est vraiment utile indique pourquoi. Je les ai mises en commentaire et le code fonctionne...
Messages postés
5
Date d'inscription
dimanche 18 avril 2004
Statut
Membre
Dernière intervention
22 septembre 2008

Bonjour,
A par le nombre de lignes ;) ce qui serait intéressant est de savoir comparer les 2 méthodes en mémoires, rapidité, compatibilité etc... Peut-être que mciSendString est codé différemment ?
Messages postés
42
Date d'inscription
dimanche 4 mars 2007
Statut
Membre
Dernière intervention
27 février 2013

Bonjour,
Le plus simple:
1) placer dans uses 'Mmsystem'
2) placer une touche dans Form1.
3) taper:
procedure TForm1.Button1Click(Sender: TObject);
begin
mciSendString('Set cdaudio door Open wait',nil,0,0);// <<< Ouvre le lecteur.
{Pour fermer le lecteur remplacer Open par Closed}
end;

Voilà bonne continuation ...
MOWGLINAUTE.
Messages postés
34
Date d'inscription
mardi 1 mai 2012
Statut
Membre
Dernière intervention
7 juillet 2017

Salut,
oui c'est vrai on peut utiliser mcisendstring...
Afficher les 6 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.