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