Eject CD

Форум для программистов

Сообщение Shurick » Чт май 20, 2004 7:22 am

Kak izvlech CD (programno)?
Ranshe ya polzoval funkciu mciSendString('set audio door open wait',...) ,
no seichas u mena dva CD , a eta funkcia vsegda vidvigaet tolko odin (perviy , kotoriy naidet).
Shurick
Сержант
 
Сообщений: 31
Зарегистрирован: Вт сен 23, 2003 8:33 am
Пункты репутации: 0

Сообщение FimanAuthor » Чт май 20, 2004 9:31 am

C++:
<!--QuoteBegin--></div><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>Цитата </td></tr><tr><td id='QUOTE'><!--QuoteEBegin-->
BOOL Eject(char Drive, BOOL bEject)
{
  char DrivePath[10];
 
  sprintf(DrivePath, "%c:\\", Drive);
 
  if(GetDriveTypeA(DrivePath) == DRIVE_CDROM)
  {
    SECURITY_ATTRIBUTES sa;

    sprintf(DrivePath, "\\\\.\\%c:", Drive);

    sa.nLength = sizeof(sa);
    sa.lpSecurityDescriptor = NULL;
    sa.bInheritHandle = TRUE;
   
    HANDLE hDisk = CreateFileA(DrivePath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, &sa,
                              OPEN_EXISTING, FILE_FLAG_WRITE_THROUGH, NULL);
    if(hDisk != INVALID_HANDLE_VALUE)
    {
      BOOL r;
      DWORD temp = 0;
      FlushFileBuffers(hDisk);
      if(bEject)r = DeviceIoControl(hDisk, IOCTL_STORAGE_EJECT_MEDIA, NULL, 0, NULL, 0, &temp, NULL);
      else r = DeviceIoControl(hDisk, IOCTL_STORAGE_LOAD_MEDIA, NULL, 0, NULL, 0, &temp, NULL);

      CloseHandle(hDisk);
      return r;
     
    }
  }
  return FALSE;
};

<!--QuoteEnd--></td></tr></table><div class='postcolor'><!--QuoteEEnd-->

Вообще это все переписано с юникодовой версии, поэтому может в ANSI и не работать.
Последний раз редактировалось FimanAuthor Чт май 20, 2004 9:33 am, всего редактировалось 1 раз.
FimanAuthor
Прапор
 
Сообщений: 71
Зарегистрирован: Чт мар 18, 2004 5:50 am
Откуда: Россия
Пункты репутации: 0

Сообщение Shurick » Чт май 27, 2004 7:13 am

A mozno na DELPHI ...
Shurick
Сержант
 
Сообщений: 31
Зарегистрирован: Вт сен 23, 2003 8:33 am
Пункты репутации: 0

Сообщение Spike » Чт май 27, 2004 7:57 am

// Данная прога извлекает и закравет CD-ROM выбранные в Combobox1
// На форме разместите Button1, Button2 и Combobox1

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, MMSystem;

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
ComboBox1: TComboBox;
procedure Button1Click(Sender: TObject);
function CloseCD(Drive : string) : Boolean;
function OpenCD(Drive : string) : Boolean;
procedure FormCreate(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
public
end;

var
Form1: TForm1;
Driv: array [1..25] of string;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
OpenCD(ComboBox1.Text);
end;

function TForm1.OpenCD(Drive: string): Boolean;
var
Res : MciError;
OpenParm: TMCI_Open_Parms;
Flags : DWord;
S : string;
DeviceID : Word;
begin
Result:=false;
S:=Drive;
Flags:=mci_Open_Type or mci_Open_Element;
with OpenParm do
begin
dwCallback := 0;
lpstrDeviceType := 'CDAudio';
lpstrElementName := PChar(S);
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_OPEN, 0);
if Res=0 then
exit;
Result:=True;
finally
mciSendCommand(DeviceID, mci_Close, Flags, Longint(@OpenParm));
end;
end;

function TForm1.CloseCD(Drive: string): Boolean;
var
Res : MciError;
OpenParm: TMCI_Open_Parms;
Flags : DWord;
S : string;
DeviceID : Word;
begin
Result:=false;
S:=Drive;
Flags:=mci_Open_Type or mci_Open_Element;
with OpenParm do
begin
dwCallback := 0;
lpstrDeviceType := 'CDAudio';
lpstrElementName := PChar(S);
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;

procedure TForm1.FormCreate(Sender: TObject);
var
w:dword;
Root:string;
I, K:integer;
begin
k:=0;
w:=GetLogicalDrives;
Root := '#:';
for i := 0 to 25 do
begin
Root[1] := Char(Ord('A')+i);
if (W and (1 shl i))>0 then
if GetDriveType(Pchar(Root)) = DRIVE_CDROM then
begin
k:=k+1;
Driv[k] := Root;
ComboBox1.Items.Add(Driv[k]);
ComboBox1.Text := Driv[1];
end;
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
CloseCD(ComboBox1.Text);
end;

end.
<!--coloro:blue--><span style="color:blue"><!--/coloro--><a href="http://www.foobar2000.ru/" target="_blank">www.foobar2000.ru - все о любимом аудиоплеере.</a><!--colorc--></span><!--/colorc-->
RUSnet #foobar2000 #miranda.
<a href="http://www.foobar2000.ru/" target="_blank">Изображение</a>

<!--coloro:red--><span style="color:red"><!--/coloro-->Даша, я люблю тебя!<!--colorc--></span><!--/colorc-->
Spike
Генерал-лейтенант
 
Сообщений: 3036
Зарегистрирован: Вт мар 18, 2003 7:34 am
Откуда: Ачинск, Красноярский край
Пункты репутации: 0

Сообщение Shurick » Сб май 29, 2004 6:35 am

Thanx
Shurick
Сержант
 
Сообщений: 31
Зарегистрирован: Вт сен 23, 2003 8:33 am
Пункты репутации: 0


Вернуться в Программирование

Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

cron