可连接对象的处理
ABBYY FineReader Engine 中的有些对象是所谓的“可连接对象”。这意味着它们可实现IConnectionPointContainer 接口。可连接对象支持 ABBYY FineReader Engine 及其客户端通信。
重要事项! 作为进程外服务器加载的 Engine对象不支持回调。
ABBYY FineReader Engine 的可连接对象及其对应回调接口列表如下:
对象 | 回调接口 (Dispinterface) |
---|---|
FRDocument | IFRDocumentEvents |
FRPages | IFRPagesEvents |
FRPage | IFRPageEvents |
ImageDocument | IImageDocumentEvents |
如要在ABBYY FineReader Engine 客户端应用程序中接收 ABBYY FineReader Engine 特定事件的通知,则应该实现特定类型的接口,并通过"advise" 方法将实现这些接口的对象与相应的可连接对象连接。有两种全局方法可用于通知源的连接和切断:
HRESULT AdviseFREngineObject( IUnknown* object, IUnknown* callback, DWORD* cookie ); HRESULT UnAdviseFREngineObject( IUnknown* object, DWORD cookie );
这些方法应该接收一个可连接对象,将其作为 object 参数,其相应的回调接口作为callback 参数。
您需要实现必要的接口,并通过"advise" 方法将实现这些接口的对象与相应的可连接对象连接。我们将以 FRDocument 对象为例。
- 实现IFRDocumentEvents 接口。因为该接口源自 IUnknown 接口,客户端对象应该也使用 IUnknown 方法:
class CFRDocumentCallback: public IFRDocumentEvents { public: ... // 提供 IUnknown 方法简单实现 ULONG STDMETHODCALLTYPE AddRef() { return 1; } ULONG STDMETHODCALLTYPE Release() { return 1; } HRESULT STDMETHODCALLTYPE QueryInterface( REFIID riid, void** ppObject ) { if( ppObject == 0 ) { return E_POINTER; } *ppObject = 0; if( riid == IID_IUnknown || riid == IID_IFRDocumentEvents ) { *ppObject = this; AddRef(); return S_OK; } else { return E_NOINTERFACE; } } // 提供 IFRDocumentEvents 方法实现 HRESULT STDMETHODCALLTYPE OnProgress( IFRDocument* sender,int percentage, VARIANT_BOOL* cancel ); HRESULT STDMETHODCALLTYPE OnWarning( IFRDocument* sender,int index, BSTR tip, VARIANT_BOOL* cancel ); HRESULT STDMETHODCALLTYPE OnPageProcessed( IFRDocument* sender, int index, PageProcessingStageEnum stage ) { return S_OK; } };
- 然后 CFRDocumentCallback 类别可用来接收来自 FRDocument 对象的通知。将该对象与通知源连接(忽略错误处理):
// 假设我们已收到 FRDocument 对象 IFRDocument* document; // 创建回调对象 CFRDocumentCallback callbackObject; // 将侦听器与通知源连接 DWORD cookie; // Advise 方法将返回一个存储 cookie 变量 AdviseFREngineObject( frDocument, &callbackObject, &cookie ); // 处理文档 ... // 通知后,侦听器将不再被需要,应该断开其连接 UnadviseFREngineObject( frDocument, cookie );
03.07.2024 8:50:25