Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Собственными руками записать CD/DVD, Что и как лучше использовать?Com или Api 
:(
    Опции темы
Ner-zul
  Дата 24.1.2007, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 232
Регистрация: 24.1.2004
Где: Москва

Репутация: нет
Всего: нет




 Добрый день,

У меня есть клиентское приложение, которое работает с базами данных под управлением IB7.0. В процессе работы у меня формируется перечень ссылок на файлы, он обрабатывается определенным образом. После окончания обрабокти все файлы, с сылками которых, я работал группируются в одну папочку на локальном диске. Далее я запускал NeroBorning и записывал эту папку с файлами на CD-носитель. Я хочу чтобы запись на носитель осуществлялась в рамках моего приложения. Какими средствами мне лучше реализовать этот механизм? Я слышал есть вариант использовать COM-объекты, а есть вариант использовать API-функции, как самого виндовса так и пишушщих программ, в т.ч. и Nero. Но второй вариант ограничивает переносимость на другие машины, так как там должна быть установлена соответствующая программа, чтобы использовать соответсвующие функуции.
Если я прав, тогда выбор стоит остановить на COM-объектах, Так?
 Тогда какие конкретно COM-объекы мне надо использовать и каким образом?

 Буду благодарен если вы мне скините примерчик или дадите на него ссылку, а также на литературу конкретно отвечающую на мой вопрос.
--------------------
 Ner-zul   
PM MAIL ICQ   Вверх
_hunter
Дата 24.1.2007, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 15
Всего: 98



у неро есть набор API. оно есть и у окон -- IMAPI. а что использовать... -- что удобнее, то и используй.
статьи/примеры поищи на форуме -- вопрос не раз поднимался...


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Snowy
Дата 24.1.2007, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Выбирай компонент на свой вкус smile
http://www.torry.net/pages.php?id=249
PM MAIL   Вверх
Ner-zul
Дата 24.1.2007, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 232
Регистрация: 24.1.2004
Где: Москва

Репутация: нет
Всего: нет



ммм, слегка конкретизирую вопрос!

Мне необходиом почитать и посмотреть примеры использования COM в Delphi.
Желательно на тематику моей задачи.
--------------------
 Ner-zul   
PM MAIL ICQ   Вверх
Snowy
Дата 24.1.2007, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Ну так в чём проблема?
Вот компонент: http://www.torry.net/vcl/filedrv/cd/CDBurner.zip
Там всего один pas файл. Открывай смотри - это готовый действующий пример работы с интерфейсом службы записи компакт-дисков.
Дока ICDBurn в MSDN: http://msdn2.microsoft.com/en-us/library/ms646705.aspx
PM MAIL   Вверх
Ner-zul
Дата 24.1.2007, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 232
Регистрация: 24.1.2004
Где: Москва

Репутация: нет
Всего: нет



спасибsmile
--------------------
 Ner-zul   
PM MAIL ICQ   Вверх
Ner-zul
Дата 24.1.2007, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 232
Регистрация: 24.1.2004
Где: Москва

Репутация: нет
Всего: нет




   Еще вопос..)
  Вот, сижу , все читаю, все разбираю, все понимаю, но:

Я скачал паскалевский файл с описанием класса TCDBurner. 
Вроде бы даже установил его как компонент в свой Дельфи.

Далее я открыл хелп файл, лежавший с ним и там нашел что то типа примера, по использованию этого класса:

Код

unit Unit1;

interface

uses
Windows,shellapi, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, CDBurner;

type
TForm1 = class(TForm)
Button1: TButton;


CDBurner1: TCDBurner;  <-- Жутко Ругается на эту строку!!!,

 говорит, что Field Form1.CDBurner1 does not have a corresponding component !!!



function CopyToCDBurnerArea(FromDir,ToDir : string ) : boolean;
procedure Button1Click(Sender: TObject);
end;

var
Form1: TForm1;
implementation

{$R *.DFM}
// Perform Folder copy
function TForm1.CopyToCDBurnerArea(FromDir,ToDir : string ) : boolean;
var
    lpFileOpStruct : TSHFileOpStruct;
begin
    lpFileOpStruct.wFunc := FO_COPY;
    lpFileOpStruct.pFrom := Pchar(FromDir+#0);
    lpFileOpStruct.pTo := Pchar(ToDir+#0);
    lpFileOpStruct.fFlags := FOF_NOCONFIRMATION or FOF_NOCONFIRMMKDIR or FOF_SILENT;
    Result := not Boolean(SHFileOperation(lpFileOpStruct));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
// Copy a folder tree to the burn area
if not CopyToCDBurnerArea('C:\FolderToAdd', cdBurner1.BurnArea ) then ShowMessage('Cannot find C:\FolderToAdd');

// Start burning
CDBurner1.StartBurn;
end;

end.


Ошибка показана в коде примера стрелочкой=)

Я чето туплю уже час и не понимаю чего ей не хватает....
Я пробовал и просто подцеплять файл с описанием класса к проекту ...но всё не то.

Такую ошибку обычно выдаёт, если собственно ручно прописать в коде например определенние Buttona , а на форме его не поставить. Но что здесь то ставить... и куда?



Это сообщение отредактировал(а) Ner-zul - 24.1.2007, 18:23
--------------------
 Ner-zul   
PM MAIL ICQ   Вверх
Coder
Дата 25.1.2007, 02:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 733
Регистрация: 13.12.2004

Репутация: 5
Всего: 11



пропиши отдельно, а не в классе формы.
Код

var
  CDBurner1: TCDBurner;

PM MAIL   Вверх
Ner-zul
Дата 25.1.2007, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 232
Регистрация: 24.1.2004
Где: Москва

Репутация: нет
Всего: нет




Спасибо, эта проблема решена!
--------------------
 Ner-zul   
PM MAIL ICQ   Вверх
umen
Дата 25.1.2007, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 11.11.2006

Репутация: нет
Всего: нет



Можно и в классе формы, просто надо на форму бросить компонент CDBurner
PM MAIL   Вверх
Ner-zul
Дата 25.1.2007, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 232
Регистрация: 24.1.2004
Где: Москва

Репутация: нет
Всего: нет



  Товарищи, объсните пожалуйста что сей код значит:

Код

constructor TCDBurner.Create(AOwner: TComponent);
var bHasDrive: Bool;
  t: PWideChar;
  s: array[0..3] of widechar;

  pidl: pItemIDList;
  nameBuf: Array [0..MAX_PATH] of Char;
  alloc: IMalloc;

Begin
  if Not(AOwner is TForm) then Raise Exception.CreateFmt('Error: Component must be owned by TForm',[]);
  inherited Create(AOwner);
  fIsBurning:=FALSE;
  if csDesigning in ComponentState then Exit;

  fFiles:=TStringList.Create;
  bNagged:=FALSE;
  fFilesToBurnKB:=0;
  FInitialized:=FALSE;

  // Get the path to the burn area from the system
  fBurnArea := '';
    if SUCCEEDED(SHGetSpecialFolderLocation(0, CSIDL_CDBURN_AREA, pidl)) then
    begin
        If pidl <> Nil Then
      Begin
             If SHGetPathFromIDList(pidl, namebuf) Then
        Begin
                 fBurnArea := StrPas(namebuf);
          If fBurnArea[Length(fBurnArea)]<>'\' then fBurnArea:=fBurnArea+'\';
        End;
        If Succeeded(SHGetMalloc(alloc)) Then alloc.Free(pidl);
      End;
    End;
   try
    iiUnknown:=CreateCOMObject(CLSID_CDBurn);
    iiCDBurn:=iiUnknown as ICDBurn;
  except
    on E: Exception do
      Begin
        FLastError:='No XP Compatible CDR API present: '+E.Message;
        Exit;
      End;
  end;

  iiCDBurn.HasRecordableDrive(bHasDrive);
  if NOT bHasDrive then
    FLastError:='No CD Burner was found'
  else
    Begin
      t:=@s;
      if iiCDBurn.GetRecorderDriveLetter(t^,4) = S_OK then
      Begin
        FBurnDrive:=t;
        FInitialized:=TRUE;
      End
      else
        FLastError:='CD Recording not enabled on Burn drive.'
    End;
End;


 
 1) Вот такой еще вопрос: Раз это конструктор, нуноли мне его вызывать в теле программы  при использовании/создании объекта данного класса??? Автор в своем примере не использует его....Правда он в этом примере еще пару описок сделал.. то есть видно, что сам он его не тестировал.

 2) Меня здесь интересует свойство fBurnArea  класса TCDBurner. Как я понял это адрес того места где будет лежать буферные данные записываемые на CD. Динамически это свойство переопределить вроде как нельзя, так как оно только для чтения. У меня на строчке использующей это property вылетает ошибка ... типа Access Violation чтоли... вот. Объясните плиз как и откуда в него что заполняется.. и откуда появляются проблемы. Если что непонятно в моём вопросе, я уточню.)


P.S. Snowy, Вы уверены, что это рабочий пример??? http://www.torry.net/vcl/filedrv/cd/CDBurner.zip



Это сообщение отредактировал(а) Ner-zul - 25.1.2007, 13:51
--------------------
 Ner-zul   
PM MAIL ICQ   Вверх
Snowy
Дата 25.1.2007, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Цитата(Ner-zul @  25.1.2007,  13:24 Найти цитируемый пост)
Меня здесь интересует свойство fBurnArea  класса TCDBurner. Как я понял это адрес того места где будет лежать буферные данные записываемые на CD. Динамически это свойство переопределить вроде как нельзя, так как оно только для чтения.
Да. Так и есть. Переопределить его нельзя.
Эта настройка не может задаваться - она берётся из настроек системы.
При очень большом желании можно и переназначить в реестре.
Но для этого нужны админские права. И делать это крайне не рекомендовано.
PM MAIL   Вверх
Ner-zul
Дата 25.1.2007, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 232
Регистрация: 24.1.2004
Где: Москва

Репутация: нет
Всего: нет



Хорошо, тогда у меня рождаются следующие вопросы:

1) Насколькоя я понимаю из объяснений автора, его пример вызовет мастер виндусовый по записи CD-дисков, а параметры задаю я и вызов этот тоже инициализирую я. Тогда я понимаю, что мне и не надо пытаться изменить дирректорию для буфферизованных данных, иначе мастер не сможет нормально все записать на диск, так? Если так, то что же мне делать??? Если его собственный пример выдает ошибки!!! ??? 
 
2)Может быть я както не правильно встроил его pas-овский файл в свой Delphi??? 

3)Он еще что-то говрит про то, что Мне обязательно надо работать с формой:
"constructor Create(AOwner: TComponent); -  Pass a TForm in as the owner.  If you need a non-visual version, register, and we'll talk."
И реально в описании конструктора, которое я привел есть строка:
Код


if Not(AOwner is TForm) then Raise Exception.CreateFmt('Error: Component must be owned by TForm',[]);
  inherited Create(AOwner);

 

А я как мне посоветовали, перенес объявление объекта TCDBurner за пределы формы:

Код

type
  TForm1 = class(TForm)
   
    function CopyToCDBurnerArea(FromDir,ToDir : string ) : boolean;

     private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  CDBurner1: TCDBurner;



Вот, может быть здесь Что не так???? Или это не то?

4)Вот такой еще вопрос: Раз это конструктор, нуноли мне его вызывать в теле программы  при использовании/создании объекта данного класса??? Автор в своем примере не использует его....Правда он в этом примере еще пару описок сделал.. то есть видно, что сам он его не тестировал.(это к предыдущему моему большому посту.)

--------------------
 Ner-zul   
PM MAIL ICQ   Вверх
Ner-zul
Дата 25.1.2007, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 232
Регистрация: 24.1.2004
Где: Москва

Репутация: нет
Всего: нет



И еще вопрос :

5) Я скачал 3 файла:

Cdburner.pas - описание класса. Его я и встроил как компонент в Дельфи.
Cdburner.html - хэлп маленький с описанием части свойств класса и примером автора по его использованию, который впринципе отказывается работать!!!
Cdburner.dcr - вот что это за файл и че с ним делать я не понял... Может я чего упустил????????

--------------------
 Ner-zul   
PM MAIL ICQ   Вверх
Snowy
Дата 25.1.2007, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Цитата(Ner-zul @  25.1.2007,  14:08 Найти цитируемый пост)
Если так, то что же мне делать??? Если его собственный пример выдает ошибки!!! ??? 
Какие ошибки?

Цитата(Ner-zul @  25.1.2007,  14:08 Найти цитируемый пост)
Может быть я както не правильно встроил его pas-овский файл в свой Delphi??? 
Оптимально - положить его в папку Lib

Цитата(Ner-zul @  25.1.2007,  14:08 Найти цитируемый пост)
Он еще что-то говрит про то, что Мне обязательно надо работать с формой:
Да. Нужно установить его в систему и бросить на форму.

Цитата(Ner-zul @  25.1.2007,  14:08 Найти цитируемый пост)
А я как мне посоветовали, перенес объявление объекта TCDBurner за пределы формы:
Лучше просто бросить на форму.
Так будет больше заморочек.

Цитата(Ner-zul @  25.1.2007,  14:08 Найти цитируемый пост)
Вот такой еще вопрос: Раз это конструктор, нуноли мне его вызывать в теле программы  при использовании/создании объекта данного класса???
Если он брошен на форму, то конструктор будет вызван автоматически.
Если нет, то нужно вызывать вручную и в качестве параметра передавать форму.

Добавлено @ 14:45 
Цитата(Ner-zul @  25.1.2007,  14:33 Найти цитируемый пост)
Cdburner.dcr - вот что это за файл и че с ним делать я не понял... Может я чего упустил????????
Его тоже брось в Lib.
Это иконка для панели компонент.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0623 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.