Невозможно стереть и, следовательно, записать на 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");
}