Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.09.18;
Скачать: CL | DM;

Вниз

Отключение дисков   Найти похожие ветки 

 
Работник   (2005-07-26 10:54) [0]

Привет. Вопрос в следущем, мне необходимо отключать диски (дисководы, флешки и т.п.)программно. Нашел для этого соответсвующий код, примерно такой:
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:28) [1]

А ты сохрани код в dll"файле а потом загружай его для каждого диска

P.S.

Если у меня вдруг все слова слились в одно - то у меня просто браузер не умеет делать пробелы:(


 
kblc ©   (2005-07-26 11:33) [2]

Если я правильно тебя понял, возьми свой код и поменяй в нём procedure CloseDisk; на procedure CloseDisk(const Disk_s: string);, а потом используй так:
CloseDisk("\\.\D:");
CloseDisk("\\.\E:");


 Если я не правт, то уточню: какие диски именно ты хочешь отключить? может их просто нельзя отключить из-за "нужды" системы?


 
Работник   (2005-07-26 11:35) [3]

А все работает и так, просто оказываеться не могу заблокировать USB-DVDRom, надо подумать... А дисководы и флешки с помощью такого кода легко блокирует.
procedure TfmMain.Button1Click(Sender: TObject);
begin
   Disk_s:="\\.\a:";
  CloseDisk;
    Disk_s:="\\.\d:";
  CloseDisk;
  // и так далее, задача тока сводиться к определению букв дисков
end;



Страницы: 1 вся ветка

Текущий архив: 2005.09.18;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.035 c
1-1124201283
Сашка
2005-08-16 18:08
2005.09.18
поиск по географическим картам


14-1124459157
Ego
2005-08-19 17:45
2005.09.18
Получил от знакомого письмо.


8-1115122982
Fire
2005-05-03 16:23
2005.09.18
использование моделей из 3dMax


14-1124445799
kaif
2005-08-19 14:03
2005.09.18
Screen shot или screenshot ? Как правильно?


5-1099313917
rect
2004-11-01 15:58
2005.09.18
Компоненты