메인 콘텐츠로 건너뛰기
ABBYY FineReader Engine 객체의 인터페이스에는 다양한 속성과 메서드가 있습니다. 일반적으로 속성은 객체에 대한 정보를 나타내고, 메서드는 객체가 수행할 수 있는 동작을 나타냅니다.
C# 샘플은 Windows에 적용됩니다. C++ 샘플은 지원되는 모든 운영 체제에 적용됩니다.
C++에서 속성은 메서드 한 쌍(읽기/쓰기 속성의 경우 get 및 put) 또는 단일 get 메서드(읽기 전용 속성의 경우)로 구성됩니다.ABBYY FineReader Engine 속성은 다음 유형일 수 있습니다.
  • VARIANT_BOOL (값은 VARIANT_TRUE 또는 VARIANT_FALSE)
  • int
  • double
  • BSTR, Unicode string에 대한 포인터. 값이 0이면 빈 string을 나타냅니다.
  • __int64
  • HANDLE*
  • IUnknown-derived interface
  • 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에 대한 포인터. 값이 0이면 빈 string을 나타냅니다.BSTRstringString
__int64__int64Int64Int64
HANDLE*void*IntPtrIntPtr
IUnknown-derived interfaceIUnknown-derived interfaceobjectObject
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 메서드에 전달하는 string과 get 메서드에서 반환되는 string을 직접 해제해야 합니다.
  • Windows에서는 C#, Visual Basic 및 Native COM 지원을 사용하는 C++에서 이 작업이 자동으로 수행됩니다.
  • Linux에서는 FREngineAllocString 및 FREngineFreeString 함수를 사용해 string용 메모리를 할당하고 해제합니다.
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에서 할당한 string을 해제합니다
::SysFreeString(res);
// "put" 메서드
BSTR str = ::SysAllocString(L"New Name");
pMyObject->put_Name(str);
// 이제 우리가 할당한 string을 해제합니다
::SysFreeString(str);
IMyObject* pMyObject;
// "get" 메서드
BSTR res;
pMyObject->get_Name(&res);
// 이제 ABBYY FineReader Engine에서 할당한 string을 해제합니다
::FREngineFreeString(res);
// "put" 메서드
BSTR str = ::FREngineAllocString(L"New Name");
pMyObject->put_Name(str);
// 이제 우리가 할당한 string을 해제합니다
::FREngineFreeString(str);
C++ 사용자는 이 속성을 다음과 같이 사용합니다.Windows:Linux:
C++ 사용자의 관점에서 보면 객체 속성의 “get” 메서드 매개변수는 객체의 interface pointer에 대한 포인터입니다. 객체의 인터페이스는 IUnknown에서 파생되므로, 여러 유형의 객체를 입력 또는 출력 매개변수로 사용하는 속성이나 메서드에 IUnknown 포인터로 전달할 수 있습니다(다만 QueryInterface 메서드를 호출해 필요한 인터페이스를 얻을 수도 있습니다).객체 속성에 “put” 메서드가 있는 경우, 해당 메서드는 유형 라이브러리에서 propput 키워드로 설명되는 clear put을 지원합니다. 즉, 기존 객체의 인터페이스에 대한 포인터를 전달하는 대신 객체가 복사됩니다.다시 MyObject 객체가 MyChildObject 유형의 객체를 참조하는 MyObjectProperty 속성을 지원한다고 가정해 보겠습니다.
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” method가 지원되지 않으므로 객체 속성을 다른 객체로 직접 바꾸는 방식으로는 변경할 수 없다는 뜻입니다. 하지만 이러한 객체의 하위 속성은 변경할 수 있습니다. C++(Windows에서는 raw C++)에서 이러한 속성을 변경하려면 속성 객체에 대한 참조를 새 변수에 전달한 다음, 이 변수를 사용해 속성을 변경해야 합니다. 아래는 읽기 전용 컬렉션으로 표현되는 ILayout::Blocks 속성의 C++ 예제입니다:
// 페이지가 이미 열려 있다고 가정합니다
ILayout* pLayout = 0;
ILayoutBlocks* pLayoutBlocks = 0;
int blockIndex = 0;
// 이전에 열린 FRPage에서 layout을 가져옵니다
pFRPage->get_Layout( &pLayout );
// pLayoutBlocks 변수는 Layout의 blocks 컬렉션에 대한 참조를 받습니다
pLayout->get_Blocks( &pLayoutBlocks );
// block 컬렉션에서 요소를 제거합니다
pLayoutBlocks->DeleteAt( blockIndex );
// 수정된 layout으로 작업합니다
...
// 객체를 해제합니다
pLayoutBlocks->Release();
pLayout->Release();