跳轉到主要內容
本節說明在以不同程式語言撰寫的應用程式中使用 ABBYY FineReader Engine 的主要相關事項,並提供探討相關主題的文章參考。 適用於 Windows 的 FRE 應用程式設計介面符合 COM 標準,可用於 C/C++、.NET、Java,或任何支援 COM 元件的開發工具。Engine 也可調整為用於 VBS、JS、Perl 等指令碼語言。 適用於 Linux 的 FRE 可在 C/C++ 和 Java 程式語言中使用。

載入、初始化與反初始化

請勿在其他動態程式庫的進入點,以及在動態程式庫中實作之靜態與全域物件的建構函式和解構函式內,初始化或反初始化 ABBYY FineReader Engine,因為這些函式會在動態程式庫進入點呼叫。
使用者應在其他位置初始化及反初始化 ABBYY FineReader Engine。例如,可在可執行模組的 main 或 WinMain 函式中進行。
在 Windows 中,這項限制是因為 Win32 的 LoadLibrary 和 FreeLibrary 函式不是可重入的。
在初始化期間,ABBYY FineReader Engine 會將 LC_CTYPE 設定重設為作業系統的預設值。如果您的應用程式依賴區域設定相關服務,應將此情況納入考量。
在 Windows 中,FRE 會重設 msvcrt.dll 的 LC_CTYPE 設定。
如果應用程式建立並使用的所有物件,在 Engine 物件反初始化之前尚未全部刪除,則在反初始化 Engine 物件期間可能會擲回 “Engine deinitialization failed” 例外狀況。如果您使用不具垃圾回收機制的程式語言 (例如 C++) ,則必須使用智慧指標類別 (在 Windows 上,請參閱 C++ (COM) 中的 samples) ,或在不再需要時釋放由建立方法所建立的物件。如果所有物件都已刪除,則此例外狀況也可能是由垃圾回收程式的運作所導致。如果應用程式是在 Windows 上使用 Visual Basic .NET 開發,所有值為 Nothing 的物件都只會標示為刪除,而不會真正刪除。 垃圾回收程式實際刪除物件的確切時間並不明確。因此,Linux 和 macOS 使用者應在反初始化 Engine 物件之前明確呼叫垃圾回收程式。Windows 使用者則應在反初始化 Engine 物件之前呼叫下列方法,讓垃圾回收程式刪除物件:
GC.Collect()
GC.WaitForPendingFinalizers()
如果您正在使用記錄功能 (可透過 Engine 物件的 StartLogging 方法啟用) ,在這種情況下也可能會出現訊息 “Warning: DeinitializeEngine() has detected external references to FREngine objects. It can indicate a leak if programming platform without automatic garbage collection is used.”。即使您明確呼叫垃圾回收器 (在 Windows 版 FRE 中為 GC.Collect) ,也不一定代表這些物件會立即刪除。在具備垃圾回收機制的環境中工作時,您可以忽略此訊息。 在沒有垃圾回收機制的環境中工作時 (例如 C++) ,這個例外與訊息可能表示您的原始程式碼中存在問題。某些物件可能未獲得正確處理,因而導致記憶體洩漏。不過,在 Engine 反初始化後,所有 FineReader Engine 物件無論如何都會被刪除,因此記憶體洩漏可能發生在用戶端程式碼部分;也就是說,如果您為 FineReader Engine 物件建立了自己的包裝器,卻未在反初始化前將其釋放,就可能發生這種情況。 請考慮使用 Engine 物件的 TotalObjectsCount 屬性;此屬性會傳回尚未釋放的物件數量,並可協助您追查記憶體洩漏。

本節另請參閱