跳转到主要内容
ABBYY FineReader Engine 对象的接口具有各种属性和方法。一般来说,属性用于描述对象的相关信息,而方法则表示对象可以执行的操作。
C# 示例适用于 Windows。C++ 示例适用于所有受支持的操作系统。
在 C++ 中,属性由一对方法组成 (读写属性使用 get 和 put 方法) ,或仅包含单个 get 方法 (只读属性) 。ABBYY FineReader Engine 属性支持以下类型:
  • VARIANT_BOOL (取值为 VARIANT_TRUE 或 VARIANT_FALSE)
  • int
  • double
  • BSTR,指向 Unicode 字符串的指针。零值表示空字符串。
  • __int64
  • HANDLE*
  • IUnknown 派生接口
  • enum
C# 和 Visual Basic 用户对属性的概念较为熟悉。对于 C++ 用户,属性由一对方法组成 (读写属性使用 get 和 put 方法) ,或仅包含单个 get 方法 (只读属性) 。不过,Microsoft C++ 提供的”原生 COM 支持”使属性的处理方式更接近 C# 中的用法。ABBYY FineReader Engine 属性支持以下类型:
IDLC++C#Visual Basic .NET
VARIANT_BOOL (VARIANT_TRUE or VARIANT_FALSE)VARIANT_BOOL (VARIANT_TRUE or VARIANT_FALSE)bool (true or false)Boolean (True or False)
intintintInteger
doubledoubledoubleDouble
BSTR,指向 Unicode 字符串的指针。零值表示空字符串。BSTRstringString
__int64__int64Int64Int64
HANDLE*void*IntPtrIntPtr
IUnknown 派生接口IUnknown 派生接口objectObject
enumenumenumEnum
有关不同类型属性的使用详情,请参阅以下内容:
下面以布尔属性为例,介绍简单属性的使用方式。该属性在类型库中的定义如下:
interface IMyObject : IUnknown
{
  [propget]
  HRESULT MyProperty( [out, retval] VARIANT_BOOL* result );
  [propput]
  HRESULT MyProperty( [in] VARIANT_BOOL value );
};
if (MyObject.MyProperty != true)
 MyObject.MyProperty = true;
IMyObject* pMyObject;
VARIANT_BOOL res;
pMyObject->get_MyProperty(&res);
if( res != VARIANT_TRUE )
   pMyObject->put_MyProperty(VARIANT_TRUE);
IMyObjectPtr pMyObject;
if(pMyObject->MyProperty != VARIANT_TRUE)
   pMyObject->MyProperty = VARIANT_TRUE
如果类型库仅为某个简单属性定义了”get”方法,则该属性为只读属性。其值不能由用户修改,只能进行”读取”访问。C# 用户对简单属性的处理方式如下:而 C++ 用户则需要通过两个方法来操作该属性,这两个方法分别带有 get_ 和 put_ 前缀。相应的 C++ 代码如下所示:不过,Windows 中的原生 COM 支持简化了这一过程,相应代码如下所示:
使用字符串属性与使用简单属性非常相似,但有其自身的特殊之处。在 C++ 中使用字符串属性时,用户必须释放传递给 set 方法的字符串,以及 get 方法返回的字符串。
  • 在 Windows 中,C#、Visual Basic 以及使用 Native COM 支持的 C++ 会自动处理此操作。
  • 在 Linux 中,请使用 FREngineAllocString 和 FREngineFreeString 函数来分配和释放字符串内存。
假设 MyObject 还支持一个名为 Name 的字符串属性。该属性在类型库中的描述如下:
interface IMyObject : IUnknown
{
  [propget]
  HRESULT Name([out, retval]BSTR* result);
  [propput]
  HRESULT Name([in]BSTR value);
};
IMyObject* pMyObject;
// "get" 方法
BSTR res;
pMyObject->get_Name(&res);
// 释放在 ABBYY FineReader Engine 中分配的字符串
::SysFreeString(res);
// "put" 方法
BSTR str = ::SysAllocString(L"New Name");
pMyObject->put_Name(str);
// 释放我们分配的字符串
::SysFreeString(str);
IMyObject* pMyObject;
// "get" 方法
BSTR res;
pMyObject->get_Name(&res);
// 释放在 ABBYY FineReader Engine 中分配的字符串
::FREngineFreeString(res);
// "put" 方法
BSTR str = ::FREngineAllocString(L"New Name");
pMyObject->put_Name(str);
// 释放我们分配的字符串
::FREngineFreeString(str);
C++ 用户对该属性的使用方式如下:Windows:Linux:
C++ 用户需要注意,对象属性的 “get” 方法的参数是指向对象接口指针的指针。由于对象的接口派生自 IUnknown,因此可以将其作为 IUnknown 指针传递给以多种类型对象作为输入或输出参数的属性或方法 (不过,您也可以通过调用 QueryInterface 方法来获取所需接口) 。对象属性的 “put” 方法 (如果存在) 支持类型库中由 propput 关键字描述的 clear put 操作,即对象会被复制,而非传递指向现有对象接口的指针。再次假设 MyObject 对象支持 MyObjectProperty 属性,该属性引用 MyChildObject 类型的对象。
interface IMyObject : IUnknown
{
  [propget]
  HRESULT MyObjectProperty([out, retval]IMyChildObject** result);
  [propput]
  HRESULT MyObjectProperty([in]IMyChildObject* value);
};
IMyObject* pMyObject;
IMyChildObject* pChildObj=0;
// get_ 方法在某些情况下可能返回 0
pMyObject->get_MyObjectProperty(&pChildObj);
// 对对象执行某些操作
...
pMyObject->put_MyObjectProperty(pChildObj);
pChildObj->Release();
C++ 用户将按如下方式编写此代码:请注意,在 C++ 中,应对通过属性获取的对象调用 Release 方法。Windows 中的 Native COM 支持会使用自动指针自动调用 AddRef 和 Release 方法。

处理只读对象属性

某些 ABBYY FineReader Engine 对象 (例如,ILayout::Blocks) 具有只读对象属性。这并不意味着此类属性无法更改,而只是说无法通过直接用另一个对象替换该属性来更改,因为不支持 “put” 方法。但是,您可以更改这些对象的子属性。 在 C++ (Windows 下的原始 C++) 中,如果您想更改此类属性,则需要将属性对象的引用传递给新变量,然后使用此变量进行更改。下面您可以看到 ILayout::Blocks 属性的 C++ 示例,该属性由只读集合表示:
// 假设页面已经打开
ILayout* pLayout = 0;
ILayoutBlocks* pLayoutBlocks = 0;
int blockIndex = 0;
// 从之前打开的 FRPage 获取版面
pFRPage->get_Layout( &pLayout );
// pLayoutBlocks 变量从 Layout 获取块集合的引用
pLayout->get_Blocks( &pLayoutBlocks );
// 从块集合中删除一个元素
pLayoutBlocks->DeleteAt( blockIndex );
// 处理修改后的版面
...
// 释放对象
pLayoutBlocks->Release();
pLayout->Release();