![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Отключение дисков [D7, Win2k]
Работник © (2005-07-26 10:54:00)Привет. Вопрос в следущем, мне необходимо отключать диски (дисководы, флешки и т.п.)программно. Нашел для этого соответсвующий код, примерно такой:
var
LHandle: THandle;
BytesReturned: Cardinal;
MsgBuf: PChar;
FSCTL_LOCK_VOLUME: Integer;
Disk_s: string;
const
FILE_DEVICE_FILE_SYSTEM: Integer = $00000009;
METHOD_BUFFERED: Integer = $00000000;
FILE_ANY_ACCESS: Integer = $00000000;
function CTL_CODE(DeviceType, FunctionNo, Method, Access: Integer): Integer;
begin
Result := (DeviceType shl 16) or (Access shl 14) or (FunctionNo shl 2) or (Method);
end;
procedure CloseDisk;
begin
//Äàëåå áëîêèðóåì ðàáîòó óñòðîéñòâ
FSCTL_LOCK_VOLUME := CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 6,
METHOD_BUFFERED, FILE_ANY_ACCESS);
LHandle := CreateFile(Pchar(Disk_s), GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ
or FILE_SHARE_WRITE, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL or
FILE_FLAG_DELETE_ON_CLOSE, 0);
if LHandle 0 then
begin
if DeviceIOControl(LHandle, FSCTL_LOCK_VOLUME, nil, 0, nil, 0, BytesReturned, nil) then
i:=0;
end;
Все нормально работает если пытаемся отключить 1 диск, при передачи попытке отключить 2-й диск, никакого эффекта.
Disk_s:='\\.\a: .
Код не мой(я его тока слегка изменил), нашел в инете, так что слабо представляю, что какая переменная значит. Может кто подскажет как программно отключить 2-а и более диска,(плохо же писать для каждого диска отдельную процедуру)
Работник (2005-07-26 11:35:00) [1]А все работает и так, просто оказываеться не могу заблокировать USB-DVDRom, надо подумать... А дисководы и флешки с помощью такого кода легко блокирует.
procedure TfmMain.Button1Click(Sender: TObject);
begin
Disk_s:='\\.\a:';
CloseDisk;
Disk_s:='\\.\d:';
CloseDisk;
// и так далее, задача тока сводиться к определению букв дисков
end;
kblc (2005-07-26 11:33:00) [2]Если я правильно тебя понял, возьми свой код и поменяй в нём
procedure CloseDisk;наprocedure CloseDisk(const Disk_s: string);, а потом используй так:
CloseDisk('\\.\D:');
CloseDisk('\\.\E:');
Если я не правт, то уточню: какие диски именно ты хочешь отключить? может их просто нельзя отключить из-за "нужды" системы?
Масяня (2005-07-26 11:28:00) [3]А ты сохрани код в dll'файле а потом загружай его для каждого диска
P.S.
Если у меня вдруг все слова слились в одно - то у меня просто браузер не умеет делать пробелы:(