跳轉到主要內容
ABBYY FineReader Engine 物件的介面包含各種屬性和方法。一般而言,屬性代表物件的相關資訊,而方法則代表物件可執行的動作。
C# 範例適用於 Windows。C++ 範例適用於所有支援的作業系統。
對 C++ 而言,屬性是一組方法 (可讀寫屬性包含 get 和 put) ,或單一 get 方法 (唯讀屬性) 。ABBYY FineReader Engine 的屬性可以是下列類型:
  • VARIANT_BOOL (有兩個值:VARIANT_TRUE 或 VARIANT_FALSE)
  • int
  • double
  • BSTR,指向 Unicode string 的指標。零值表示空字串。
  • __int64
  • HANDLE*
  • 衍生自 IUnknown 的介面
  • enum
C# 和 Visual Basic 使用者對屬性的概念都很熟悉。對 C++ 使用者而言,屬性是一組方法 (可讀寫屬性包含 get 和 put) ,或單一 get 方法 (唯讀屬性) 。不過,Microsoft C++ 提供的「Native COM 支援」功能,讓屬性的處理方式更接近 C# 的做法。ABBYY FineReader Engine 的屬性可以是下列類型:
IDLC++C#Visual Basic .NET
VARIANT_BOOL (VARIANT_TRUE 或 VARIANT_FALSE)VARIANT_BOOL (VARIANT_TRUE 或 VARIANT_FALSE)bool (true 或 false)Boolean (True 或 False)
intintintInteger
doubledoubledoubleDouble
BSTR,指向 Unicode string 的指標。零值表示空字串。BSTRstringString
__int64__int64Int64Int64
HANDLE*void*IntPtrIntPtr
衍生自 IUnknown 的介面衍生自 IUnknown 的介面objectObject
enumenumenumEnum
如需了解如何使用不同類型的屬性,請參閱下文詳細說明:
我們將以 Boolean 屬性為例,說明簡單屬性的使用方式。此屬性在型別程式庫中的描述如下:
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 中的 Native COM 支援 可讓此程序更簡單,對應的程式碼如下:
使用 string 屬性的方式與使用簡單屬性非常相似,但也有其特殊之處。使用 string 屬性的 C++ 使用者,必須釋放傳遞給 set 方法的字串,以及由 get 方法傳回的字串。
  • 在 Windows 中,這項作業會在 C#、Visual Basic,以及具備 Native COM 支援的 C++ 中自動完成。
  • 在 Linux 中,請使用 FREngineAllocString 和 FREngineFreeString 函式來配置及釋放字串記憶體。
假設 MyObject 也支援名為 Name 的 string 屬性。此屬性在型別程式庫中的描述如下:
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” 方法,則其支援 clear put,這在型別程式庫中是以 propput 關鍵字描述的。這表示系統會複製該物件 (而不是傳遞現有物件介面的指標) 。再次假設 MyObject 物件支援 MyObjectProperty 屬性,而該屬性參照的是 MyChildObject type 的物件。
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 支援會使用 auto pointers 自動呼叫 AddRef 和 Release 方法。

處理唯讀物件屬性

某些 ABBYY FineReader Engine 物件 (例如 ILayout::Blocks) 具有唯讀的物件屬性。這並不表示這類屬性無法變更,而只是表示無法透過以另一個物件直接取代該物件屬性來加以變更,因為不支援 “put” 方法。不過,您可以變更這些物件的子屬性。 在 C++ 中 (若在 Windows 上,則為原生 C++) ,如果您想變更這類屬性,必須先將屬性物件的參考指派給新的變數,再使用該變數進行變更。以下是 ILayout::Blocks 屬性的 C++ 範例;此屬性以唯讀集合表示:
// 假設頁面已開啟
ILayout* pLayout = 0;
ILayoutBlocks* pLayoutBlocks = 0;
int blockIndex = 0;
// 從先前開啟的 FRPage 取得 layout
pFRPage->get_Layout( &pLayout );
// pLayoutBlocks 變數從 Layout 取得區塊集合的參考
pLayout->get_Blocks( &pLayoutBlocks );
// 從區塊集合中移除一個元素
pLayoutBlocks->DeleteAt( blockIndex );
// 處理修改後的 layout
...
// 釋放物件
pLayoutBlocks->Release();
pLayout->Release();