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...
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.