Отображение прогресса проверки 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;   

Я не думаю, что есть событие для этого, хотя я довольно новичок в Имапи. Возможно, вы захотите показать приблизительное время вместо этого с некоторым связанным текстовым объяснением, чтобы пользователь знал, что происходит, и ваше приложение не казалось "зависшим".

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