![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как задвинуть дверцу CDROM обратно [D3, WinXP]
Зяц © (2004-08-19 01:36:00)подскажите, как сделать сабж, жилательно с исходником.
Спасибо большое заранее.
Дмитрий Ботвин (2004-08-30 16:54:00) [1](АD)acid, а твой "извращенный" способ и для удалённых компов работает???
grom (2004-08-30 16:33:00) [2]извращённый способ и правда работает проверил на ХР
а чем он лучше широко распространнёного
function CloseCD(Drive:string):Boolean;
grom (19.08.04 20:18) [21]
(AD)acid (2004-08-30 08:30:00) [3]Я предлагаю особо извращённый способ работающий только в WinNT/2k/XP
И это не шутка!!!!
const
IOCTL_STORAGE_EJECT_MEDIA = $2D4808;
IOCTL_STORAGE_LOAD_MEDIA = $2D480C;
procedure OpenCD(Drive: Char);
Var
hDev:Cardinal;
hResult:LongBool;
Junk:Cardinal;
begin
hDev:=CreateFile(PChar('\\.\'+Drive+':'),
GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE,
nil,
OPEN_EXISTING,
0,
0);
if hDev = INVALID_HANDLE_VALUE then
begin
MessageBox(0,PChar('Программа не может получить доступ к устройству '+Drive+':'),'TestProg',MB_OK or MB_ICONERROR or MB_TASKMODAL);
Exit;
end;
hResult:=DeviceIoControl(hDev,
IOCTL_STORAGE_EJECT_MEDIA,
nil,
0,
nil,
0,
Junk,
nil);
if hResult = False then
begin
MessageBox(0,'Ошибка при работе с устройством!','TestProg',MB_OK or MB_ICONERROR or MB_TASKMODAL);
end;
CloseHandle(hDev);
end;
procedure CloseCD(Drive: Char);
Var
hDev:Cardinal;
hResult:LongBool;
Junk:Cardinal;
begin
hDev:=CreateFile(PChar('\\.\'+Drive+':'),
GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE,
nil,
OPEN_EXISTING,
0,
0);
if hDev = INVALID_HANDLE_VALUE then
begin
MessageBox(0,PChar('Программа не может получить доступ к устройству '+Drive+':'),'TestProg',MB_OK or MB_ICONERROR or MB_TASKMODAL);
Exit;
end;
hResult:=DeviceIoControl(hDev,
IOCTL_STORAGE_LOAD_MEDIA,
nil,
0,
nil,
0,
Junk,
nil);
if hResult = False then
begin
MessageBox(0,'Ошибка при работе с устройством!','TestProg',MB_OK or MB_ICONERROR or MB_TASKMODAL);
end;
CloseHandle(hDev);
end;
nikkie (2004-08-19 22:01:00) [4]мир, дружба, фестиваль. а мастера Дельфи - самые отзывчивые во всем рунете.
Зяц (2004-08-19 21:34:00) [5]Огромное спасиба, вся работаеет. Теперь буду изучать паскаль и если не понятка встретиться, обязательно спрошу вас, хорошие вы мои ребяты!
Спасиба всем!
OSokin (2004-08-19 20:56:00) [6]Закрыть:
mciSendString('set cdaudio door open', nil, 0, 0);
Открыть:
mciSendString('set cdaudio door open', nil, 1, 0);
А чтобы проверить, есть ли диск в приводе, юзай GetDiskFreeSpace. Там можно выбрать диск любой
grom (2004-08-19 20:18:00) [7]задвинуть дверцу CDROM
function CloseCD(Drive:string):Boolean;
var
Res : MciError;
OpenParm: TMCI_Open_Parms;
Flags,DeviceID : Word;
begin
Result:=false;
Flags:=mci_Open_Type or mci_Open_Element;
with OpenParm do begin
dwCallback := 0;
lpstrDeviceType := 'CDAudio';
lpstrElementName := PChar(Drive+':');
end;
Res := mciSendCommand(0, mci_Open, Flags, Longint(@OpenParm));
if Res<>0 then exit;
DeviceID:=OpenParm.wDeviceID;
try
Res:=mciSendCommand(DeviceID, MCI_SET, MCI_SET_DOOR_CLOSED, 0);
if Res=0 then exit;
Result:=True;
finally
mciSendCommand(DeviceID, mci_Close, Flags, Longint(@OpenParm));
end;
end;
uses mmsystem;
Зяц (2004-08-19 20:07:00) [8]Большая спасибо, это компилируется и дверца открывается :) но не закрывается :(
Но всё равно спасиба.
Анатолий (2004-08-19 19:09:00) [9]Не отчаивайтесь. Для начала попробуйте так:
unit Door;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, mmSystem;
type
TForm1 = class(TForm)
Open: TButton;
Close: TButton;
procedure OpenClick(Sender: TObject);
procedure CloseClick(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.OpenClick(Sender: TObject);
begin
mciSendString(PChar('Set cdaudio Door Open Wait'), nil, 0, 0);
ShowMessage('The door is opened.. Wayyy!');
end;
procedure TForm1.CloseClick(Sender: TObject);
begin
mciSendString(PChar('Set CDAudio door close'), nil, 0, 0);
ShowMessage('In future You can close doors on any computer. But you should teach Pascal. Ok?');
end;
end.
Это точно откомпилируется.
rOOse (2004-08-19 18:43:00) [10]Добавь MMSystem в Uses
Зяц (2004-08-19 18:28:00) [11]Неужели никто не знает!! Не верю!
Heeeeeeelp!
Pul (2004-08-19 17:24:00) [12]
> nikkie © (19.08.04 11:42) [7]
> >[6] Anatoly Podgoretsky
> неправильно.
> SpeechEngine.SayIt("hey, close the door, dude!")
> должно подействовать...
SpeechEngine.SayIt("Осторожно двери закрываются!")
-SeM- (2004-08-19 17:12:00) [13]Да, веселая ветка :)
Digitman (2004-08-19 17:05:00) [14]
> Зяц
прежде чем елозить дверцами чужих приводов, неплохо было бы почитать хоть что-нибудь про Паскаль
nikkie (2004-08-19 17:00:00) [15]хотя... может и твой сойдет. попробуй переименовать Unit1.pas в Unit1.cpp. должно помочь!
nikkie (2004-08-19 16:59:00) [16]компилятор поменяй. в твоем ошибка.
Зяц (2004-08-19 16:38:00) [17]У меня не получается. Помогите.
Я делаю так:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
mciSendString("set CDAudio door open", NULL, 0, NULL);
end;
end.
Нажимаю ctlr-F9, она пишет:
[Error] Unit1.pas(28): Undeclared identifier: 'mciSendString'
[Error] Unit1.pas(28): Illegal character in input file: '"' ($22)
[Error] Unit1.pas(28): Missing operator or semicolon
[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'
Что я делаю не так?
Зяц (2004-08-19 13:42:00) [18]FAq посмотрел, там нет ничего полезного для моей задаче :(
Anatoly Podgoretsky (2004-08-19 13:20:00) [19]Надо понимать, что FAQ ты посмотрел и тебе не подошло, а чем именно?
Зяц (2004-08-19 12:01:00) [20]Мне надо, серьёзно, но вы шутите, злые люди.
Help me please!