Невозможно стереть и, следовательно, записать на DVD с использованием кода IMAPI 2.0 C++

Я пишу в C++ с использованием IMAPI 2.0.

Требование: необходимо проверить наличие данных на CD/DVD (RW CD/DVD), если да, удалить данные и записать новые данные на них.

Проблема: я определил отдельный метод для стирания и отдельный для записи на DVD. В каждом модуле я совместно использую DiscMaster, инициализирую рекордер, получаю доступ и, следовательно, выполняю соответствующие функции стирания или записи. После выполнения функции функционирует Discrecorder и вызывается CoUnInitialize. Следовательно, делая рекордер свободным для следующего исполнения. я звоню EraseMedia() сначала, а потом WriteMedia() в основном метод.

Наблюдения: - Если я только звоню EraseMedia() [и не вызывайте WriteMedia()], удаление происходит правильно. - Если я звоню только WriteMedia() [и не вызывайте EraseMedia()] на том же DVD, на котором было выполнено удаление, данные записываются на DVD правильно. - Если я сначала вызываю EraseMedia (), а затем WriteMedia () в той же dll, при последовательных вызовах, это дает Java Crash Error некоторую ошибку, произошедшую в собственном коде.

Пожалуйста, наставьте меня, правильно ли я действую. Если я не прав, предоставьте пример кода для вышеуказанного потока, используя IMAPI 2.0 C++.

Прикрепленный журнал ошибок и код DLL C++.

bool eraseMedia()
{
   ::CoInitializeEx(NULL, COINIT_MULTITHREADED);
   CDiscMaster  discMaster; 

   if (!discMaster.Initialize())
   {
   return false;
   }

   long totalDevices = discMaster.GetTotalDevices();
   if (totalDevices == 0 && FAILED(discMaster.GetHresult()))
   {
        printf("\nFailed to initailize total number of devices\n");
   }

   for (long deviceIndex = 0; deviceIndex < totalDevices; deviceIndex++)
   {
   BSTR recorderUniqueID = discMaster.GetDeviceUniqueID(deviceIndex);
   if (SysStringLen(recorderUniqueID) == 0) // check if id is blank
   {
     printf("\nid is blank\n");
     continue;
   }

   CDiscRecorder* pDiscRecorder = new CDiscRecorder();
   assert(pDiscRecorder != NULL);
   if (pDiscRecorder == NULL)
   continue;

   if (!pDiscRecorder->Initialize(recorderUniqueID))
   {
     if (totalDevices == 1 && FAILED(pDiscRecorder->GetHresult()))              
     {
       printf("\nFailed to initialize recorder\n");
     }
     delete pDiscRecorder;
     continue;
   }

   string volumeList;
   ULONG totalVolumePaths = pDiscRecorder->GetTotalVolumePaths();
   for (ULONG volIndex = 0; volIndex < totalVolumePaths; volIndex++)
   {
     if (volIndex)
        volumeList += ",";
     BSTR val = pDiscRecorder->GetVolumePath(volIndex);
     std::string s = _bstr_t(val, false); 
     volumeList = volumeList + s;
   }        
   string CLIENT_STR = "WriteCD";
   BSTR CLIENT =   _com_util::ConvertStringToBSTR(CLIENT_STR.c_str());
   if (pDiscRecorder->AcquireExclusiveAccess(true, CLIENT)) 
   {
      CDiscFormatErase* eraseFormat = new CDiscFormatErase();
      if (eraseFormat->Initialize(pDiscRecorder, CLIENT))
      {
         BSTR owner = NULL;
         owner = pDiscRecorder->ExclusiveAccessOwner();
         if (FAILED(pDiscRecorder->GetHresult()))
         {
            printf("\nFailed to get exclusive owner \n");
         }                      

         if (owner)
         {
            std::wcout << owner << std::endl;
            SysFreeString(owner);
         }

         bool chk = eraseFormat->PutFullErase(VARIANT_TRUE);
         if (chk != true && FAILED(eraseFormat->GetHresult()))
         {
              printf("\nFailed to set erasure\n");
              return false;
         }    

         bool format = eraseFormat->EraseMedia();
         std::cout << format;

         pDiscRecorder->~CDiscRecorder();
         discMaster.~CDiscMaster();

         }

       }

    }

 ::CoUninitialize();
 printf("executed till erasure point");
}


bool writeToMedia()
{
    ::CoInitializeEx(NULL, COINIT_MULTITHREADED);
    CDiscMaster discMaster;       
    if (!discMaster.Initialize())
    {
      return false;
    }

    long totalDevices = discMaster.GetTotalDevices();
    if (totalDevices == 0 && FAILED(discMaster.GetHresult()))
    {
         printf("\nFailed to initailize total number of devices\n");
    }

    for (long deviceIndex = 0; deviceIndex < totalDevices; deviceIndex++)
    {
         BSTR recorderUniqueID = discMaster.GetDeviceUniqueID(deviceIndex);

        if (SysStringLen(recorderUniqueID) == 0) 
        {
           printf("\nid is blank\n");
           continue;
        }

    CDiscRecorder* pDiscRecorder = new CDiscRecorder();
    assert(pDiscRecorder != NULL);
    if (pDiscRecorder == NULL)
       continue;

    if (!pDiscRecorder->Initialize(recorderUniqueID))
    {
       if (totalDevices == 1 && FAILED(pDiscRecorder->GetHresult()))
       {
          printf("\nFailed to initialize recorder\n");
       }

       delete pDiscRecorder;
       continue;
    }

   string volumeList;
   ULONG totalVolumePaths = pDiscRecorder->GetTotalVolumePaths();
   for (ULONG volIndex = 0; volIndex < totalVolumePaths; volIndex++)        
   {
        if (volIndex)
              volumeList += ",";
        BSTR val = pDiscRecorder->GetVolumePath(volIndex);
        std::string s = _bstr_t(val, false); 
        volumeList = volumeList + s;
   }

   string CLIENT_STR = "WriteCD";
   BSTR CLIENT = _com_util::ConvertStringToBSTR(CLIENT_STR.c_str());
   if (pDiscRecorder->AcquireExclusiveAccess(true, CLIENT)) 
   {
      CDiscFormatData discFormatData;
      if (discFormatData.Initialize(pDiscRecorder, CLIENT))
      {
         IMAPI_FORMAT2_DATA_MEDIA_STATE state;
         discFormatData.GetInterface()->get_CurrentMediaStatus(&state);
         string status = GetMediaStatus(state);

         IMAPI_MEDIA_PHYSICAL_TYPE mediaType = IMAPI_MEDIA_TYPE_UNKNOWN;
discFormatData.GetInterface()->get_CurrentPhysicalMediaType(&mediaType);

         IStream* dataStream = NULL;
         if (!CreateMediaFileSystem(mediaType, &dataStream))
         {
           return false;
         }

         discFormatData.SetCloseMedia(false);               

         discFormatData.Burn(dataStream);

         dataStream->Release();

         pDiscRecorder->EjectMedia();

         pDiscRecorder->ReleaseExclusiveAccess();

         if (SUCCEEDED(discFormatData.GetHresult()))
         {
             printf("\n Executed Write \n");
         }
         else  if (FAILED(discFormatData.GetHresult()))
        {
             printf("\n Failed to Write \n");
        }

      }

    }

   }

  ::CoUninitialize();
  printf("executed till this point");
  return true;
 }

JNIEXPORT void JNICALL Java_jnieg_Main_Print
(JNIEnv *, jobject)
{   
   eraseMedia();
   writeToMedia();
   printf("Executed dll");
}

0 ответов

Другие вопросы по тегам