Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Открытие и закрытие нескольких приводов CD-ROM

Delphi , Файловая система , Диски

Открытие и закрытие нескольких приводов CD-ROM

Автор: Vadim Petrov

Глубокая ночь. Сидит юзер за компом. Вдруг на мониторе белым по черному высвечивается: "Если нажмешь 10 клавиш одновременно, покажу голую бабу". Ну юзер не долго думая продавливает 10 клавиш обоими руками. Тут на мониторе появляется: "Молодец! А если, скатина, отпустишь хоть одну клавишу - все диски форматну!!!"

Что касается вопроса "Открытие и закрытие привода CD-ROM", то при наличии более одного CD-ROMа в системе, рекомендую воспользоваться следующими функциями:


//                  ____       _          ______            __
//                 / __ \_____(_)   _____/_  __/___  ____  / /____
//                / / / / ___/ / | / / _ \/ / / __ \/ __ \/ / ___/
//               / /_/ / /  / /| |/ /  __/ / / /_/ / /_/ / (__  )
//              /_____/_/  /_/ |___/\___/_/  \____/\____/_/____/
//
(*******************************************************************************
* DriveTools 1.0                                                               *
*                                                                              *
*                 (c) 1999 Jan Peter Stotz                                     *
*                                                                              *
********************************************************************************
*                                                                              *
* If you find bugs, has ideas for missing featurs, feel free to contact me     *
*                           jpstotz@gmx.de                                     *
*                                                                              *
********************************************************************************
* Date last modified:   May 22, 1999                                           *
*******************************************************************************)

unit DriveTools;

interface

uses

  Windows, SysUtils, MMSystem;

function CloseCD(Drive: Char): Boolean;
function OpenCD(Drive: Char): Boolean;

implementation

function OpenCD(Drive: Char): 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 CloseCD(Drive: Char): 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;

end.

Перевод на русский язык:

Код, предоставленный ниже, это модуль Delphi, содержащий две функции: OpenCD и CloseCD. Эти функции используются для открытия и закрытия CD-ROM приводов в системе с несколькими CD-ROM приводами.

Работает код следующим образом:

  1. Функция OpenCD принимает букву привода (например, 'A', 'B' и т.д.) и пытается открыть соответствующий CD-ROM привод.
  2. Она использует функцию mciSendCommand из модуля MMSystem для отправки команды MCI (Media Control Interface) драйверу.
  3. Команда используется для открытия CD-ROM привода, и если операция успешна, она устанавливает флаг, указывающий, что привод открыт.

  4. Функция CloseCD также принимает букву привода и пытается закрыть соответствующий CD-ROM привод.

  5. Она использует тот же подход, что и функция OpenCD, но с другой командой MCI для установки статуса двери CD-ROM привода в закрытом состоянии.

Обратите внимание, что это код предполагает, что система имеет несколько CD-ROM приводов, и необходимо их обрабатывать отдельно.

Некоторые улучшения, которые я бы предложил:

  1. Обработка ошибок: функции не проверяют ошибки, возвращаемые mciSendCommand. Лучше добавить обработку ошибок для обеспечения возврата успешного кода.
  2. Организация кода: две функции имеют почти идентичный код, который можно было бы рефакторить в одну функцию с параметром, указывающим, открыть или закрыть привод.
  3. Безопасность типов: переменная DeviceID объявлена как Word, но не ясно, какой тип значения она должна содержать. Лучше использовать более конкретный тип, например, Integer.
  4. Читаемость кода: некоторые имена переменных (например, Res, S) можно было бы улучшить для clearer.

Вот альтернативное решение с использованием единой функции с параметром:

function CDControl(Drive: Char; OpenClose: Boolean): Boolean;
var
  Res: MciError;
  OpenParm: TMCI_Open_Parms;
  Flags: DWord;
  S: string;
  DeviceID: Integer;
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
    if OpenClose then
      Res := mciSendCommand(DeviceID, MCI_Set, MCI_Set_Door_Open, 0)
    else
      Res := mciSendCommand(DeviceID, MCI_Set, MCI_Set_Door_Closed, 0);
    if Res = 0 then
      Result := True;
  finally
    mciSendCommand(DeviceID, mci_Close, Flags, Longint(@OpenParm));
  end;
end;

function OpenCD(Drive: Char): Boolean; begin Result := CDControl(Drive, True); end;
function CloseCD(Drive: Char): Boolean; begin Result := CDControl(Drive, False); end;

В этом коде создается единственная функция CDControl, которая принимает два параметра: букву привода и булевое значение, указывающее, открыть или закрыть привод. Функция затем использует это информацию для отправки соответствующей команды MCI. Функции OpenCD и CloseCD являются просто обертками вокруг функции CDControl.

Открытие и закрытие нескольких приводов CD-ROM можно выполнить с помощью функций OpenCD и CloseCD из модуля DriveTools для программирования на языке Delphi.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Диски ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-01-29 03:01:06/0.0037720203399658/0