Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Блокируем Cd-rom что не так делаю


Автор: Asd 27.3.2004, 20:21
Подскажите как сделать блокировкку разблокировку Cd-rom я пробовал так но не работает

Код
function LockCD(DriveCD:char; Locked:boolean):Boolean;
const IOCTL_STORAGE_MEDIA_REMOVAL = $002D4804;
var hDrive : THandle;
Returned : DWORD;
DisableEject : boolean;
Drv: string;
begin
result:=False;
Drv:= '\\.\'+DriveCd+':';
hDrive := CreateFile(PChar(Drv), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if GetLastError <> 0 then Exit;
try
DisableEject := Locked;
Result:=DeviceIoControl(hDrive,IOCTL_STORAGE_MEDIA_REMOVAL,
@DisableEject,sizeof(DisableEject),nil,0,Returned,nil);
finally
 CloseHandle(hDrive);
end;
end;

Автор: DriveSoftware 28.3.2004, 14:52
Код

//заблокировать
void CMFcDlg::OnBnClickedButton1()
{
HANDLE hDevice = CreateFile ("\\\\.\\E:",  
GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
NULL,
NULL);
DWORD dwBytesReturned = 0;
PREVENT_MEDIA_REMOVAL pmr = {TRUE};
if(!DeviceIoControl (hDevice, IOCTL_STORAGE_MEDIA_REMOVAL, &pmr, sizeof(pmr), NULL, 0, &dwBytesReturned, NULL)) AfxMessageBox ("Door can\'t be locked");
CloseHandle (hDevice);
}

//разблокировать
void CMFcDlg::OnBnClickedButton2()
{
HANDLE hDevice = CreateFile ("\\\\.\\E:",  
GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
NULL,
NULL);
DWORD dwBytesReturned = 0;
PREVENT_MEDIA_REMOVAL pmr = {FALSE};
if(!DeviceIoControl (hDevice, IOCTL_STORAGE_MEDIA_REMOVAL, &pmr, sizeof(pmr), NULL, 0, &dwBytesReturned, NULL)) AfxMessageBox ("Door can\'t be unlocked");
CloseHandle (hDevice);

}

Автор ответа: Baa



Может кто нибудь перелапатит на Delphi

Автор: dm9 28.3.2004, 16:17
Есть у меня подозрение, что в Delphi это будет выглядеть так:

Код
procedure TForm1.Button1Click(Sender: TObject);
type
  TPreventMediaRemoval = record
     f: Boolean;
  end;
var
  hDevice : THandle;
  dwBytesReturned : DWord;
  pmr : ^TPreventMediaRemoval;
begin
  hDevice := CreateFile ('\\\\.\\E:', GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE,
     nil, OPEN_EXISTING, 0, 0);
  dwBytesReturned := 0;
  pmr^.f := true;
  if not DeviceIoControl (hDevice, IOCTL_STORAGE_MEDIA_REMOVAL, pmr, sizeof (TPreventMediaRemoval),
     nil, 0, dwBytesReturned, nil)
  then ShowMessage ('Door can''t be locked');
  CloseHandle (hDevice);
end;


Это заблокировать.
Для разблокировки pmr^.f := false;

Только вот IOCTL_STORAGE_MEDIA_REMOVAL в Delphi не декларировано, так что проверить я не смог sad.gif

У кого установлено что-то типа VC, посмотрите, чему равна константа.

Автор: stab 28.3.2004, 16:34
ВХОД:
drive, буква диска
lock, True - заблокировать, False - разблокировать

ВЫХОД:
True - успех
False - ошибка

Код

function LockDrive(drive: Char; lock: Boolean): Boolean;
type
 PREVENT_MEDIA_REMOVAL = packed record
   PreventMediaRemoval: LongBool;
 end;

const
 IOCTL_STORAGE_MEDIA_REMOVAL = $2D4804;

var
 hDevice: THandle;
 pmr: PREVENT_MEDIA_REMOVAL;
 dwBytesReturned: DWORD;

begin
 Result := False;
 hDevice := CreateFile(PChar('\\.\' + drive + ':'), GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);
 if hDevice <> 0 then
 begin
   pmr.PreventMediaRemoval := lock;
   Result := DeviceIoControl(hDevice, IOCTL_STORAGE_MEDIA_REMOVAL, @pmr, SizeOf(pmr), nil, 0, dwBytesReturned, nil);
   CloseHandle(hDevice);
 end;
end;

Автор: dm9 28.3.2004, 16:38
Да, с pmr я сглупил. Там в моём случае надо выделять память.

Скажи, а что такое '\\\\.\\E:'. Чем это отличается от '\\.\E:'?
Добавлено @ 16:40
Всё, вопрос снят. Я дурак. В Си слэш - это служебный символ, и для вывода слэша надо эго дублировать в строке.

Автор: DriveSoftware 28.3.2004, 21:47
cully

И что оно блокирует?!?!
У меня не пашет.

Автор: stab 28.3.2004, 22:33
DriveSoftware, диск в CD-ROM, DVD-ROM, у мя пашет, а если у тебя не пашет так отлаживай, Open Source функция smile.gif , а ты же программист biggrin.gif

Автор: p0s0l 30.3.2004, 14:33
DriveSoftware, надеюсь, у тебя 2k/XP ?

Автор: DriveSoftware 30.3.2004, 18:05
p0s0l


Стоит, но пробывал под Me.

Автор: p0s0l 30.3.2004, 19:25
DriveSoftware, и что, под 2k/XP не пашет ? Про Me сказано:
Цитата
Requirements

Client: Included in Windows XP, Windows 2000 Professional, Windows NT Workstation 4.0.

Т.е. на Me это работать не должно...
Можешь посмотреть, что тебе возвращает LockDrive (by cully), true или false...


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)