Отправляет email-рассылки с помощью сервиса Sendsay

Delphi для профессионалов

  Все выпуски  

Delphi для профессионалов Определение пишущего устройства и его буквенного имени


Всем привет!

Вакансии с форума

Поступили следующие вакансии на форум:


Delphi Developer (Kiev) Вакансия от компании CIKLUM.

We are looking for Developer who is:
∙ Skilled in Delphi with emphasis of GUI, not necessarily an expert.
∙ Knowledgeable about MS SQL in particular store procedure.

 

Определение пишущего устройства и его буквенного имени

Если Вы когда-нибудь пыталить определить наличие установленого в системе пишущего устройства в своей программе, вероятно Вы обращались к функции WinAPI GetDriveType и удивлялись почему она не работает положеным образом. Прочитав данную статью Вы получите простое решение по даннному вопросу.

Внимание: Данное решение работает под системами Windows XP/VISTA!

Операционные системы Windows XP и VISTA поддерживают новый программный интерфейс API называемый IMAPI, который включает в себя функционал для определения специфической информации относительно установленных в системе CD/DVD-приводах. Данный API также пожжердивает эмуляцию записи, запись, стираниае и создание мультисессионных дисков.

В данной статье используется небольшой набор функциональности указаного API для определения наличия пишущего CD/DVD-привода.

Перед тем как начинать испытания по коду убедитесь, что в список подключенных модулей входит "COMObj".

Итак. Приступим.

 

Для того, чтобы получить доступ к функциям и методам доступным в данном интерфейсе на мнеобходимо объявить интерфейс c его идентификатором класса:

type
  ICDBURN = interface( IUnknown )
    ['{3d73a659-e5d0-4d42-afc0-5121ba425c8d}']
  function GetRecorderDriveLetter(var StrDrive: WideChar; CharCount: uInt): HResult; stdcall;
  function Burn(hWindow: HWND): HResult; stdcall;
  function HasRecordableDrive(out pfHasRecorder: Bool): HResult; stdcall;
end;

Данный интерфейс должне быть объявлен как потомок от COMObject со специфическим идентификатором класса:

const
  CLSID_XPDICBURN: TGUID = '{fbeb8a05-beee-4442-804e-409d6c4515e9}';

Полностью весь код объявления может выглядеть т.о.:

var
  IICDBurn: ICDBURN;
begin
  try
    IICDBurn := CreateCOMObject(CLSID_XPDICBURN) as ICDBURN;
  except
    { catch all errors }
  end;
end;

Как, вероятно, Вы уже обратили внимание, интерфейс ICDBURN поддерживает три метода для определения записывающего устройства, получения его буквенного обозначения в системе и отображения помощника записи.
Внимание: Никогда не меняйте порядок определения этих методов! Это объявление уже существующего в системе объекта COMObject!

Теперь все готово чтобы проверить есть ли записывающее устройство у нас в системе и определить его буквенное обозначение:

function xpCDRAvailable(out DriveLetter: string): Boolean;
var
  HasRecorder: Bool;
  IICDBurn: ICDBURN;
  PDriveLetter: PWideChar;
  DriveLetters: array[0..3] of WideChar;
begin
  Result := False;
  DriveLetter := '';
  PDriveLetter := @DriveLetters;
  try
    IICDBurn := CreateCOMObject(CLSID_XPDICBURN) as ICDBURN;
    IICDBurn.HasRecordableDrive(HasRecorder);
    if (HasRecorder) and (IICDBurn.GetRecorderDriveLetter(PDriveLetter^, SizeOf(DriveLetters)) = S_OK) then begin
      Result := True;
      DriveLetter := string(PDriveLetter);
    end;
  except
    { catch all errors }
  end;
end;

function xpDiskBurn: Boolean;
var
  DriveLetter: string;
  IICDBurn: ICDBURN;
begin
  Result := xpCDRAvailable(DriveLetter);
  if not(Result) then Exit;
  try
    IICDBurn := CreateCOMObject(CLSID_XPDICBURN) as ICDBURN;
    IICDBurn.Burn(0);
  except
    { catch all errors }
  end;
end;

Собственно и все. Мы получили 2 функции, которые нам позвляют узнать начиличие пишущего устройства и вызвать диалог полощника по записи диска.

Постоянная ссылка на статью: http://igp.org.ua/articles/a180/

На этом на сегодня позвольте распрощаться. Ждите следующего выпуска. С уважением, автор рассылки Игорь.

 

 

Обсудить выпуск можно на форуме (http://forum.igp.org.ua/?num=1175289010).
Предложить тему для следующей рассылки также можно на форуме (http://forum.igp.org.ua/?num=1175288840).


В избранное