显示IMAPI2验证进度?

时间:2012-08-19 23:04:20

标签: progress verification imapi

我已成功将IMAPI2集成到我的应用程序中。我可以毫无问题地刻录CD / DVD。但是,我无法在我的应用程序中显示IMPAI2验证进度,因此应用程序在验证模式(快速和完全)中看起来像冻结了几分钟。 我谷歌无处不在,我没有找到任何东西。请问,任何人都可以帮忙吗?

2 个答案:

答案 0 :(得分:0)

我不认为有这样的事件,因为我对imapi很新。您可能希望显示估计的时间而不是一些相关的文字说明,因此用户将知道最新情况,您的应用程序不会显示为“冻结”。

答案 1 :(得分:0)

您可以使用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;