Éjecter le cd-rom

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

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.