Название: Создание прогресс бара при записи диска
Отправлено: 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....
|