Un code assez simple démontrant l'utilisation de l'api DeviceIoControl, avec comme code de controle FSCTL_LOCK_VOLUME pour le blocage du volume. Ceci est un code en réponse a une question posée sur le forum (
http://www.delphifr.com/forum.v2.aspx?ID=501631#2).
Le volume bloquée est débloqué a la fermeture du programme (vu que l'handle utilisé pour le pointage vers celui-ci est libéré) sinon vous utilisez un simple CloseHandle comme montré dans le code ou un FSCTL_UNLOCK_VOLUME dans DeviceIoControl.
On obtien un handle sur le volume via CreateFile.
Source / Exemple :
var
bByteReturn: Cardinal;
FSCTL_LOCK_VOLUME: integer;
begin
try
//FSCTL_LOCK_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM,6,METHOD_BUFFERED,FILE_ANY_ACCESS)
FSCTL_LOCK_VOLUME := CTL(FILE_DEVICE_FILE_SYSTEM, METHOD_BUFFERED, 6, FILE_ANY_ACCESS); //dwIoControlCode Code de controle de l'action a effectuer
hFile := CreateFile(PChar('\\.\' + copy(dcbLecteur.Text, 1, pos(':', dcbLecteur.Text))), GENERIC_WRITE or GENERIC_READ, FILE_SHARE_READ + FILE_SHARE_WRITE,
nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); //on récupère un handle sur le volume désiré
//FILE_SHARE_READ ou FILE_SHARE_WRITE est obligatoire (au moins l'un des deux) pour dwShareMode
if hFile = INVALID_HANDLE_VALUE then //si l'handle est invalide alors on arrête
begin
ShowMessage(SysErrorMessage(GetLastError)); //message explicatif du code erreur renvoyé
//par GetLastError
Exit;
end;
if NOT DeviceIoControl(hFile, FSCTL_LOCK_VOLUME, nil, 0, nil, 0, bByteReturn, nil) then
ShowMessage(SysErrorMessage(GetLastError)) //message explicatif du code erreur renvoyé
else //par GetLastError
Caption := dcbLecteur.Text + ' > Locked (' + IntToStr(hFile) + ')';
//******************************************************************************
//Si vous avez un accès refusé c'est possible que vous n'y avez pas accès car
//il y a un fichier d'ouvert sur ce volume ! Il vous faut laccès exclusif dessus
//******************************************************************************
ShowMessage('Si tout s''est bien passé, n''oubliez pas de UNLOCK le meme driver que vous avez' +
^M + 'LOCK! sinon en fermant le programme les volumes seront reliberés a la fermeture des handles');
except
ShowMessage(SysErrorMessage(GetLastError))
end;
Conclusion :
Compo standar + API
- wG -
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.