跳转到主要内容
本主题适用于 Windows 版 FRE。
在服务器应用程序中使用 ABBYY FineReader Engine 时,有以下一些特点:
  • 必须在一个进程内的多个线程中同时处理多个相互独立的请求
  • Engine 在高性能多 CPU 计算机的服务器操作系统上运行
  • 需要结合特殊帐户使用 (Network Service、Local Service、ASPNET)
在开发 ABBYY FineReader Engine 12 时,已考虑到上述特点,并在 API 中提供了相应工具,使您能够在服务器进程内或独立进程中获取线程安全的 FineReader Engine 对象。在多个进程中使用 FineReader Engine,可以创建能够同时工作的对象池,并充分利用服务器计算机的全部 CPU 资源。在大多数服务器场景中,这是最佳方法。

将 Engine 对象加载到服务器应用程序中

将 Engine 加载到服务器应用程序中的最佳方式,是通过 COM 将其作为进程外服务器加载到单独的进程中。此方法可自动消除所有与多线程相关的问题:对 ABBYY FineReader Engine 对象的所有操作都会通过 COM 进行序列化,因此您可以在多个进程中创建多个 Engine 实例,并在服务器进程内同时使用它们。而且,此方法也易于使用。Engine 对象是通过 OutprocLoader 对象加载的,后者实现了 IEngineLoader 接口。
IEngineLoader engineLoader = new FREngine.OutprocLoader();
IEngine engine = engineLoader.InitializeEngine( customerProjectId, licensePath, licensePassword, "", "", false );
// 我们已在单独的进程中获取到 Engine
try {
 ...
} finally {
 engineLoader.ExplicitlyUnload(); // 不再需要时即可将其卸载
}
不过,此方法也有一个重要缺点。将其用于特殊账户时,可能需要为这些账户授予运行 OutprocLoader 的权限。不过,这一点以及需要注册 FREngine.dll,在服务器产品中并不算特别关键,因为服务器应用程序通常由经验丰富的管理员安装在少量计算机上。
  • 可以使用 DCOM Config 实用程序设置账户权限 (可以在命令行中键入 DCOMCNFG,也可以依次选择“控制面板”>“管理工具”>“组件服务”) 。在控制台树中,找到“组件服务”>“计算机”>“我的电脑”>“DCOM 配置”文件夹,右键单击 ABBYY FineReader Engine 12.5 Loader (Local Server),然后单击“属性”。此时会打开一个对话框。单击“安全”选项卡。在“启动权限”下,单击“自定义”,然后单击“编辑”,以指定哪些账户可以启动该应用程序。
请注意,在 64 位操作系统上,已注册的 DCOM 应用程序可在 32 位 MMC 控制台中使用,可通过以下命令行运行:
"mmc comexp.msc /32"
  • 要在最终用户的计算机上安装应用程序时注册 FREngine.dll,请使用 regsvr32 工具。如果您使用的是 64 位操作系统,默认会运行 64 位版本的 regsvr32。请使用以下命令行:
regsvr32 /s /n /i:"<path to the Inc folder>" "<path to FREngine.dll>"
  • 我们建议您在调试和运行服务器应用程序时都使用 Network 许可证。
此外,您还可以通过 IHostProcessControl 接口管理宿主进程的优先级,并控制其是否保持运行。 此外,还可使用其他方法来加载 ABBYY FineReader Engine。不过,这些方法具有某些特性,会在很大程度上限制它们在服务器应用程序中的使用。
  • ABBYY FineReader Engine 可以通过 COM 作为当前进程中的进程内服务器加载。该方法还会自动消除所有与多线程相关的问题 (对 ABBYY FineReader Engine 对象的所有操作都通过 COM 串行化) ,并且易于使用。但是,此方法不允许您通过多个 Engine 对象实例组织并行处理,这在很大程度上限制了服务器性能。该方法的另一个缺点是,在最终用户的计算机上安装应用程序时,需要注册 FREngine.dll。
  • 也可以手动加载 FREngine.dll。这是加载该库的标准方法。此方法要求对 Engine 对象的所有操作都必须在初始化该 Engine 对象的同一线程中执行。此外,它不允许在每个进程中初始化多个 Engine 对象。这会严重限制服务器性能。因此,我们不建议使用此方法。此方法的一个优点是,在最终用户的计算机上安装应用程序时,无需注册 FREngine.dll。
有关 ABBYY FineReader Engine 中三种可用加载方法的详细说明,请参阅 加载 Engine 对象的不同方式

示例

EnginesPool 代码示例展示了如何在多线程应用程序中实现处理器池,您可以在此示例的基础上进行修改,以满足自身需求并开始开发应用程序。

另请参阅

Engine 对象的不同加载方式