здравствуйте пишу свой 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....
поясните подробнее как подлключить обработчик и тд и тп