Как реализовать открывание/закрывание оптического дисковода?

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Как реализовать открывание/закрывание оптического дисковода?

Сообщение Teckel256 » 26.12.2010 18:24:07

Собственно говоря, в системе два дисковода, и хотелось бы иметь возможность выбирать между ними. Раньше я писал подобную программу в Delphi, но там название импортируемого Unit'а отличается.
Да и дисковод тогда у меня был один. А само обращение к функции выглядело примерно так:
Код: Выделить всё
mciSendString([параметры обращения к DLL'ке]);


P.S. Желательно, чтобы список дисководов не был фиксированным (может быть один, два, три или любое кол-во дисководов).

P.P.S. Такое же, наверное, возможно?
Teckel256
незнакомец
 
Сообщения: 2
Зарегистрирован: 26.12.2010 18:12:29

Re: Как реализовать открывание/закрывание оптического дисковода?

Сообщение coyot.rush » 26.12.2010 19:52:14

но там название импортируемого Unit'а отличается

mciSendString http://msdn.microsoft.com/en-us/library/dd757161%28VS.85%29.aspx
наверное придется вручную объявить эту функцию (проще подсмотреть в delphi :roll: )

P.S. Желательно, чтобы список дисководов не был фиксированным (может быть один, два, три или любое кол-во дисководов).
P.P.S. Такое же, наверное, возможно?

http://expert.delphi.int.ru/question/67/
Код: Выделить всё
   1. //Получение списка CD-ROM и иже с ними
   2. procedure CDROMsList(var DrvLst:TStringList);
   3. var buf:array[0..255] of char;
   4. tmp:string;
   5. begin
   6. if DrvLst=nil then DrvLst:=TStringList.Create;
   7. DrvLst.Clear;
   8. GetLogicalDriveStrings(256,buf);
   9. tmp:='';
  10. for i:=0 to 254 do
  11. begin
  12. if buf[i]<>#0 then
  13. tmp:=tmp+buf[i]
  14. else
  15. begin
  16. if GetDriveType(pchar(tmp))=DRIVE_CDROM then
  17. DrvLst.Add(tmp);
  18. tmp:='';
  19. if buf[i+1]=#0 then break;
  20. end;
  21. end;
  22. end;
  23. 
  24. //Открытие лотка заданного дисковода d:string, в виде строк "D:", "E:" и т.п.
  25. //Если DoEject=true - выдвигаем, если false, то закрываем
  26. procedure CloseEject(Drv:string;DoEject:boolean);
  27. var OpenParm:TMCI_OPEN_PARMS;
  28. SetParm:TMCI_Set_Parms;
  29. GenParm:TMCI_GENERIC_PARMS;
  30. ID:integer;
  31. 
  32. begin
  33. openparm.lpstrDeviceType:=pchar('CDAudio');
  34. openparm.lpstrElementName:=pchar(Drv);
  35. if mciSendCommand(0, MCI_OPEN,MCI_OPEN_TYPE or MCI_WAIT or MCI_OPEN_ELEMENT, LongInt(@OpenParm))=0 then
  36. begin
  37. ID:=openparm.wDeviceID;
  38. if DoEject then
  39. mciSendCommand(ID,MCI_SET,MCI_WAIT or MCI_SET_DOOR_OPEN,LongInt(@SetParm))
  40. else
  41. mciSendCommand(ID,MCI_SET,MCI_WAIT or MCI_SET_DOOR_CLOSED,LongInt(@SetParm));
  42. mciSendCommand(ID,MCI_CLOSE,0,LongInt(@GenParm));
  43. end;
  44. end;


Добавлено спустя 12 минут 8 секунд:
Код: Выделить всё
function  mciSendString (lpstrCommand, lpstrReturnString: PAnsiChar; uReturnLength: Cardinal; hWndCallback: HWND): Cardinal; external 'mciSendStringA@ winmm.dll  stdcall'


Добавлено спустя 1 минуту 37 секунд:
mmsystem не допилен :shock:
Аватара пользователя
coyot.rush
постоялец
 
Сообщения: 309
Зарегистрирован: 14.08.2009 08:59:48

Re: Как реализовать открывание/закрывание оптического дисковода?

Сообщение Teckel256 » 27.12.2010 14:40:05



Вот я почитал там, и вспомнил про один немаловажный аспект. Как узнать, открыт или закрыт дисковод в данный момент?

Все, прочитал код, разобрался. Там, оказывается, все написано.
Teckel256
незнакомец
 
Сообщения: 2
Зарегистрирован: 26.12.2010 18:12:29


Вернуться в Lazarus

Кто сейчас на конференции

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

Рейтинг@Mail.ru