Russian Qt Forum

Компиляторы и платформы => Windows => Тема начата: koldun90 от Август 25, 2016, 22:06



Название: Создание прогресс бара при записи диска
Отправлено: koldun90 от Август 25, 2016, 22:06
здравствуйте пишу свой cd/dvd writer на основе imapi v2
написал метод которых пишет папку на диск

Код
C++ (Qt)
//запись данных на диск
HRESULT MainWindow::writedataoncd()
{
   IDiscFormat2Data *discformatdata=NULL;
   IDiscRecorder2 *discrecorder=NULL;
   IDiscMaster2 *master=NULL;
   IFileSystemImage * image = NULL;
   IFileSystemImageResult * fsiresult = NULL;
   FsiFileSystems fileSystem;
   IFsiDirectoryItem *root;
   IStream *stream;
   BSTR dir = ::SysAllocString(L"C:\\test");
   //инициализируем идискформатдата 2
   HRESULT m_hResult=CoCreateInstance(__uuidof(MsftDiscFormat2Data),NULL,CLSCTX_ALL,
                              __uuidof(IDiscFormat2Data),(void**)&discformatdata);
   if (!SUCCEEDED(m_hResult))
   {
       msg.setText(QString::fromLocal8Bit("Дискформатдата не проинициализирована"));
       msg.exec();
   }
   //инициализируем идискрекордер
   m_hResult = CoCreateInstance(__uuidof(MsftDiscRecorder2), NULL, CLSCTX_INPROC_SERVER,
   __uuidof(IDiscRecorder2), (void**)&discrecorder);
   if (!SUCCEEDED(m_hResult))
   {
       msg.setText(QString::fromLocal8Bit("ошибка инициализации"));
       msg.exec();
   }
   BSTR info=NULL;
   m_hResult = CoCreateInstance(__uuidof(MsftDiscMaster2), NULL, CLSCTX_INPROC_SERVER,
   __uuidof(IDiscMaster2), (void**)&master);
   HRESULT res=master->get_Item(0,&info);  //получили полное имя привода в системе
   if (FAILED(res))  //если  не получили дискмастер
   {
       msg.setText(QString::fromLocal8Bit("Не инициализирован идискмастер"));
       msg.exec();
   }
   //получаем имя
   res=master->get_Item(0,&info);
   if (!SUCCEEDED(res))
   {
       msg.setText("ошибка");
       msg.exec();
   }
   //инициализируем идискрекордер (привод 0-первый привод в системе
   res=discrecorder->InitializeDiscRecorder(info);
   if (!SUCCEEDED(res))
   {
       msg.setText("ошибка");
       msg.exec();
   }
   BSTR appname=::SysAllocString(L"burning");
   res=discrecorder->AcquireExclusiveAccess(false,appname);
   if (!SUCCEEDED(res))
   {
       msg.setText("не получили экслюзивный доступ к устройству");
       msg.exec();
   }
   res=discformatdata->put_Recorder(discrecorder);
   if (!SUCCEEDED(res))
   {
       msg.setText("ошибка");
       msg.exec();
   }
   //BSTR appname=::SysAllocString(L"burning");
   res=discformatdata->put_ClientName(appname);
   if (!SUCCEEDED(res))
   {
       msg.setText("ошибка");
       msg.exec();
   }
 
 
   SAFEARRAY *value=NULL;
   res=discformatdata->get_SupportedMediaTypes(&value);
   if (!SUCCEEDED(res))
   {
       msg.setText("ошибка");
       msg.exec();
   }
 
   //не закрываем диск для последующей записи
   res=discformatdata->put_ForceMediaToBeClosed(VARIANT_FALSE);
   if (!SUCCEEDED(res))
   {
       msg.setText("ошибка");
       msg.exec();
   }
   //discformatdata->
   res = CoCreateInstance(CLSID_MsftFileSystemImage,
       NULL, CLSCTX_ALL, __uuidof(IFileSystemImage), (void**)&image);
   if (!SUCCEEDED(res))
   {
       msg.setText("ошибка");
       msg.exec();
   }
 
   res=discformatdata->put_ForceOverwrite(true);
   if (!SUCCEEDED(res))
   {
       msg.setText("ошибка");
       msg.exec();
   }
   //УСТАНАВЛИВАЕМ ФАЙЛОВУЮ СИСТЕМУ ОБРАЗА
 
   fileSystem=FsiFileSystemUDF;
   res=image->put_FileSystemsToCreate(fileSystem);
   if (!SUCCEEDED(res))
   {
       msg.setText("ошибка");
       msg.exec();
       return res;
   }
   BSTR mt=BSTR(L"metka");
   res=image->put_VolumeName(mt);
   if (!SUCCEEDED(res))
   {
       msg.setText("ошибка");
       msg.exec();
   }
   res=image->get_Root(&root);
 
   if (SUCCEEDED(res))
   {
       root->AddTree(dir,false);
   }
   res=image->CreateResultImage(&fsiresult);
   if (SUCCEEDED(res))
   {
       res=fsiresult->get_ImageStream(&stream);
       if (SUCCEEDED(res))
       {
           msg.setText("образ готов для записи");
           msg.exec();
       }
   }
   if (SUCCEEDED(res))
   {
 
       res=discformatdata->Write(stream);
   }
//    m_hResult = CoCreateInstance(__uuidof(Ms), NULL, CLSCTX_INPROC_SERVER,
//    __uuidof(IDiscRecorder2), (void**)&discrecorder);
 
   if (stream)
   {
       stream->Release();
       stream=NULL;
   }
   if (SUCCEEDED(res))
   {
       printf("disc uspeshnp zapisan\n");
       IMAPI_MEDIA_WRITE_PROTECT_STATE value =
            (IMAPI_MEDIA_WRITE_PROTECT_STATE)0;
 
       res = discformatdata->get_WriteProtectStatus(&value);
   }
   if (!SUCCEEDED(res))
   {
       printf("oshibka zapisi na disk=0x%08x\n\n",res);
   }
   discrecorder->EjectMedia();
   if (SUCCEEDED(res))
   {
       res = discformatdata->put_Recorder(NULL);
   }
   if (image)
   {
       image->Release();
       image = NULL;
   }
   if (fsiresult)
   {
       fsiresult->Release();
       fsiresult=NULL;
   }
   if (discformatdata)
   {
       discformatdata->Release();
       discformatdata=NULL;
   }
   if (discrecorder)
   {
       discrecorder->Release();
       discrecorder=NULL;
   }
   return res;
}
 
Собственно хотел написать прогресс бар(подключить обработчик событий) как в примере данном в мсдн
https://msdn.microsoft.com/ru-ru/lib...(v=vs.85).aspx

но так и не понял последовательность действий
WScript.ConnectObject dataWriter, "dwBurnEvent_" -- вот это не понятно
я так понял нужно зарегать обработчик передав idiscformatdata также реализовать метод update....
поясните подробнее как подлключить обработчик и тд и тп


Название: Re: Создание прогресс бара при записи диска
Отправлено: qate от Август 26, 2016, 12:58
может глупость спрошу, но зачем писать свой  рекордер, если есть готовые ?
например infrarecorder.org


Название: Re: Создание прогресс бара при записи диска
Отправлено: koldun90 от Август 26, 2016, 20:21
очень хочу написать и пока все норм толко не знаю как подключить прогресс бар(обработчик событий) отблагодарю....


Название: Re: Создание прогресс бара при записи диска
Отправлено: qate от Август 26, 2016, 21:47
задача редкая (если учесть что DVD уже давно ненужны)
в линуксах делают иначе - есть штатная писалка, а к ней делают морду с картами и танцовщицами
самому вникать в тонкости писания дисков лень и занятие скучное (хотя ранее было интересное, но прогресс уже ушел вперде)


Название: Re: Создание прогресс бара при записи диска
Отправлено: koldun90 от Август 26, 2016, 21:49
нужно в винде для толкового прогера работа небольшая


Название: Re: Создание прогресс бара при записи диска
Отправлено: poru от Август 29, 2016, 09:29
Тут все есть, разбирайся
http://www.codeproject.com/Articles/22538/Burning-CD-DVD-Media-with-the-Image-Mastering-API (http://www.codeproject.com/Articles/22538/Burning-CD-DVD-Media-with-the-Image-Mastering-API)


Название: Re: Создание прогресс бара при записи диска
Отправлено: koldun90 от Август 30, 2016, 13:13
в том то и дело я как раз брал за основу данный проект эрика хадена
в итоге метод который записывает файлы и папки у меня получилось сделать а обработчик событий
я не совсем понял как мне подключить....
я просто  понял так так что нужно отнаследовать свой от DDiscFormat2DataEvents
и реализовать там свой метод Update...
вопрос в том как подключить к данному обработчику(моему отнаследованному классу) мой интерфейс idiscformat2data который собственно и пишет диск методом write....