class CFRDocumentCallback: public IFRDocumentEvents {
public:
CFRDocumentCallback() : startTime( 0 ) {}
// 实现 IUnknown 方法
ULONG STDMETHODCALLTYPE AddRef() { return 1; }
ULONG STDMETHODCALLTYPE Release() { return 1; }
HRESULT STDMETHODCALLTYPE QueryInterface( REFIID riid, void** ppObject );
HRESULT STDMETHODCALLTYPE OnProgress( IFRDocument* document, int percentage, VARIANT_BOOL* ShouldContinue );
HRESULT STDMETHODCALLTYPE OnWarning( IFRDocument* document, int pageNumber, BSTR recognizerTip,
VARIANT_BOOL* ShouldContinue );
HRESULT STDMETHODCALLTYPE OnPageProcessed( IFRDocument* document, int pageNumber, PageProcessingStageEnum stage );
void FlushTimer();
void SetShouldTrackTime( bool _shouldTrackTime );
private:
time_t startTime;
bool shouldTrackTime = true;
};
// 调用 FlushTimer 方法以重置 startTime
void CFRDocumentCallback::FlushTimer() {
time( &startTime );
}
// 此回调可能用于其他方法,
// 若不再需要超时功能,请将 shouldTrackTime 设置为 FALSE
void CFRDocumentCallback::SetShouldTrackTime( bool _shouldTrackTime ) {
shouldTrackTime = _shouldTrackTime;
}
// 若当前时间与 "startTime" 之差超过某一阈值,
// 处理过程将被中止
HRESULT STDMETHODCALLTYPE CFRDocumentCallback::OnProgress( IFRDocument* frDocument,
int percentage, VARIANT_BOOL* shouldTerminate )
{
if( shouldTrackTime ) {
time_t currentTime;
time( ¤tTime );
double seconds = difftime( currentTime, startTime );
printf( "%f\n", seconds );
*shouldTerminate = ( seconds > 100 ? VARIANT_TRUE : VARIANT_FALSE );
}
return S_OK;
}