Russian Qt Forum
Май 03, 2024, 18:37 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: [1]
1  Компиляторы и платформы / Windows / Re: вопросы по imapi2 : Август 11, 2022, 10:13
вообщем начал потихоньку разбираться написал функцию записи папки а диск
вот что получилось....
Код
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);
   }
   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;
 
}
 
но соответсвенно есть небольшая проблемка функция записывает содержимое папки на диск
но почему то метод write
Код
C++ (Qt)
res=discformatdata->Write(stream);
 
возвращает
ошибку
Код
C++ (Qt)
0x80004005
судя по описанию ошибки
https://msdn.microsoft.com/ru-ru/library/windows/desktop/aa364892(v=vs.85).aspx

это Unspecified failure.
вся загвоздка в том что данные реально на диск записались корректно(пишу тестовый файл doc)
что может быть?
os windows 7

Не подскажете в чем проблема была?
Столкнулся с подобной - образ создается, но не пишется - на вызове
Код
C++ (Qt)
IDiscFormat2Data->write
получаю ошибку
Код
C++ (Qt)
0x80004005

Пытаюсь писать на диски RW, на R не пробовал.
Страниц: [1]

Страница сгенерирована за 0.161 секунд. Запросов: 24.