Отображение прогресса проверки IMAPI2?
Я успешно интегрировал IMAPI2 в свое приложение. Я могу записывать CD/DVD без проблем. Тем не менее, я не могу отобразить процесс проверки IMPAI2 в Моем приложении, поэтому приложение выглядит как замороженное на несколько минут в режиме проверки (как быстрого, так и полного). Я везде гуглю и ничего не нашел. Пожалуйста, кто-нибудь может помочь?
2 ответа
Вы можете получить приблизительное оставшееся время операции записи, используя метод IDiscFormat2DataEventArgs::get_RemainingTime из интерфейса IDiscFormat2DataEventArgs.
Получите приблизительное общее время для операции записи, используя метод IDiscFormat2DataEventArgs::get_TotalTime.
Получить общее прошедшее время операции записи с помощью метода IDiscFormat2DataEventArgs::get_ElapsedTime.
Или получить текущее действие записи, выполняемое с использованием метода IDiscFormat2DataEventArgs::get_CurrentAction.
Перечисление IMAPI_FORMAT2_DATA_WRITE_ACTION определяет текущее состояние операции записи при использовании интерфейса IDiscFormat2DataEventArgs:
- IMAPI_FORMAT2_DATA_WRITE_ACTION_VALIDATING_MEDIA Проверка того, что текущий носитель поддерживается.
- IMAPI_FORMAT2_DATA_WRITE_ACTION_FORMATTING_MEDIA Форматирование носителя при необходимости.
- IMAPI_FORMAT2_DATA_WRITE_ACTION_INITIALIZING_HARDWARE Инициализация оборудования, например, установка скорости записи на диск.
- IMAPI_FORMAT2_DATA_WRITE_ACTION_CALIBRATING_POWER Оптимизация интенсивности лазера для записи на носитель.
- IMAPI_FORMAT2_DATA_WRITE_ACTION_WRITING_DATA Запись данных на носитель.
- IMAPI_FORMAT2_DATA_WRITE_ACTION_FINALIZATION Завершение записи. Это состояние зависит от носителя и может включать такие элементы, как закрытие дорожки или сеанса или завершение фонового форматирования.
- IMAPI_FORMAT2_DATA_WRITE_ACTION_COMPLETED Успешно завершил процесс записи.
- IMAPI_FORMAT2_DATA_WRITE_ACTION_VERIFYING Проверка целостности записанного носителя.
Вы можете реализовать метод DDiscFormat2DataEvents::Update, чтобы получать уведомления о ходе выполнения текущей операции записи.
STDMETHODIMP_(HRESULT) CDiscFormatDataEvent::XFormatDataEvents::Update(IDispatch* objectDispatch, IDispatch* progressDispatch)
{
METHOD_PROLOGUE(CDiscFormatDataEvent, FormatDataEvents)
IDiscFormat2DataEventArgs* progress = NULL;
HRESULT hr = progressDispatch->QueryInterface(IID_PPV_ARGS(&progress));
IDiscFormat2Data* discFormatData = NULL;
hr = objectDispatch->QueryInterface(IID_PPV_ARGS(&discFormatData));
IMAPI_FORMAT2_DATA_WRITE_ACTION currentAction = IMAPI_FORMAT2_DATA_WRITE_ACTION_VALIDATING_MEDIA;
hr = progress->get_CurrentAction(¤tAction);
ASSERT(SUCCEEDED(hr));
if (FAILED(hr)) return S_OK;
IMAPI_STATUS imapiStatus = {0};
if ((currentAction == IMAPI_FORMAT2_DATA_WRITE_ACTION_WRITING_DATA) ||
(currentAction == IMAPI_FORMAT2_DATA_WRITE_ACTION_FINALIZATION))
{
progress->get_ElapsedTime(&imapiStatus.elapsedTime);
progress->get_RemainingTime(&imapiStatus.remainingTime);
progress->get_TotalTime(&imapiStatus.totalTime);
if (currentAction == IMAPI_FORMAT2_DATA_WRITE_ACTION_WRITING_DATA)
{
progress->get_StartLba(&imapiStatus.startLba);
progress->get_SectorCount(&imapiStatus.sectorCount);
progress->get_LastReadLba(&imapiStatus.lastReadLba);
progress->get_LastWrittenLba(&imapiStatus.lastWrittenLba);
progress->get_TotalSystemBuffer(&imapiStatus.totalSystemBuffer);
progress->get_UsedSystemBuffer(&imapiStatus.usedSystemBuffer);
progress->get_FreeSystemBuffer(&imapiStatus.freeSystemBuffer);
}
}
LRESULT ret = ::SendMessage(pThis->m_hNotifyWnd, WM_IMAPI_UPDATE, currentAction, (LPARAM)(LPVOID)&imapiStatus);
if (ret == RETURN_CANCEL_WRITE)
discFormatData->CancelWrite();
return S_OK;
}
Чтобы узнать текущий процент выполнения записи, убедитесь, что ваше текущее действие равно IMAPI_FORMAT2_DATA_WRITE_ACTION_WRITING_DATA, и просто рассчитайте:
LONG writtenSectors = imapiStatus.lastWrittenLba - imapiStatus.startLba;
LONG totalSectors = imapiStatus.sectorCount;
progressPercentage = 100 * writtenSectors / totalSectors;
Я не думаю, что есть событие для этого, хотя я довольно новичок в Имапи. Возможно, вы захотите показать приблизительное время вместо этого с некоторым связанным текстовым объяснением, чтобы пользователь знал, что происходит, и ваше приложение не казалось "зависшим".