Esta função é usada para obter um ponteiro para a interface IEngine. Ela recebe como parâmetro de entrada o ID do projeto do cliente, que é uma string alfanumérica comum a todas as licenças Developer e Runtime usadas pelo seu projeto.
Para usuários de Linux e Windows, esta função facilita o acesso ao licenciamento online, se necessário, e também permite especificar alguns parâmetros adicionais durante a inicialização.
Private Declare Function InitializeEngine Lib "FREngine.dll" ( _ CustomerProjectID As String, _ LicensePath As String, _ LicensePassword As String, _ FREngineDataFolder As String, _ FREngineTempFolder As String, _ IsSharedCPUCoresMode As Boolean, _ ByRef Engine As FREngine.IEngine) _As Integer
CustomerProjectID[in] Uma string que contém o ID do projeto do cliente.
Durante a inicialização da biblioteca, a lista de todas as licenças disponíveis é pesquisada em busca de uma licença de Desenvolvedor ou Runtime correspondente a este ID do projeto do cliente. Se nenhuma licença correspondente for encontrada, ocorrerá um erro referente à última licença verificada. No entanto, você pode passar 0 para este parâmetro e selecionar a licença mais tarde, chamando o método IEngine::SetCurrentLicense antes de qualquer outro método da biblioteca.
LicensePath[in] O nome completo do arquivo da Licença Online. Se você não usar uma Licença Online, passe uma string vazia "" ou um ponteiro Null. A string vazia "" ou o ponteiro Null devem ser passados.Para usuários do macOS: este parâmetro é reservado para uso futuro.LicensePassword[in] A senha da Licença Online. Se você não usar uma Licença Online, passe uma string vazia "" ou um ponteiro Null.Para usuários do macOS: este parâmetro é reservado para uso futuro.FREngineDataFolder[in] Contém o caminho para a pasta em que o ABBYY FineReader Engine deve armazenar dados específicos do usuário.Por padrão, para instalação automática:%ProgramData%\ABBYY\SDK\12\FineReader Engine for auxiliary engine dataAlém disso, para Linux e Windows:%ProgramData%\ABBYY\SDK\12\Licenses for license dataSe você definir o valor de FREngineDataFolder, todas as informações auxiliares serão gravadas em uma nova pasta de dados.Talvez seja necessário alterar o valor padrão, por exemplo, se as configurações de idioma da interface do seu aplicativo precisarem ser diferentes das de outros aplicativos que usam o FineReader Engine. Depois de alterar o padrão, certifique-se de ter permissões de controle total na nova pasta de dados.FREngineTempFolder[in] Contém o caminho para a pasta dos arquivos temporários do ABBYY FineReader Engine. Por padrão, é a pasta %TEMP%\ABBYY FineReader Engine 12.IsSharedCPUCoresMode[in] Especifica se os núcleos da CPU devem ser usados no modo compartilhado. Há dois modos de uso dos núcleos da CPU: separado e compartilhado. No modo separado, o ABBYY FineReader Engine usa no máximo a quantidade de processos permitida pela licença. No modo compartilhado, qualquer número de processos pode ser executado, mas todos esses processos usarão apenas os núcleos da CPU especificados pela propriedade IMultiProcessingParams::SharedCPUCoresMask.
Este parâmetro é ignorado no ABBYY FineReader Engine para Windows.
Engine[out, retval] Um ponteiro para uma variável de ponteiro IEngine* que recebe o ponteiro de interface para o objeto Engine resultante.
Apenas um objeto Engine pode ser criado com esta função em uma única instância do aplicativo que usa o ABBYY FineReader Engine. Tentativas repetidas de criar o objeto Engine retornarão o mesmo objeto.
A criação do objeto Engine pode levar um tempo considerável. Durante a inicialização, o mecanismo carrega a biblioteca principal listada abaixo, juntamente com um grande número de bibliotecas dinâmicas adicionais:
Linux: libFREngine.so
macOS: libFREngine.dylib
Windows: FREngine.dll
Ao usar uma licença de rede, a inicialização no Linux e no Windows também pode demorar mais devido à comunicação com o servidor de licenças. Certifique-se de que a conexão de rede ofereça o desempenho necessário; recomenda-se uma largura de banda de pelo menos 100 Kb/s para uma operação confiável com licença de rede.
É possível criar e executar o objeto Engine em um sistema multiprocessador, mas pode haver apenas um objeto Engine em cada processo. Uma segunda chamada a InitializeEngine dentro do mesmo processo retornará uma referência ao objeto existente. Portanto, você deve criar um objeto Engine separado para cada processo chamando a função InitializeEngine.
Para implementações do ABBYY FineReader Engine for Windows que envolvam sistemas multiprocessadores, talvez sejam úteis outros métodos para carregar o objeto Engine.
Não inicialize nem desinicialize o ABBYY FineReader Engine nos pontos de entrada de outras bibliotecas dinâmicas, nem em construtores e destrutores de objetos estáticos e globais implementados em bibliotecas dinâmicas, porque eles são chamados nos pontos de entrada da biblioteca dinâmica.
O usuário deve inicializar e desinicializar o ABBYY FineReader Engine em outro local. Por exemplo, na função main ou WinMain de um módulo executável.
: No Windows, essa restrição se deve ao fato de que as funções Win32 LoadLibrary e FreeLibrary não são reentrantes.
Durante a inicialização, o ABBYY FineReader Engine redefinirá a configuração LC_CTYPE para os padrões do sistema operacional. Esse fato deve ser levado em consideração se o aplicativo depender de serviços sensíveis à localidade (especificamente msvcrt.dll no Windows).Os desenvolvedores de Windows que usam .NET devem garantir que [STAThread] (modelo de apartamento de thread único) seja especificado como um atributo na função principal do aplicativo; caso contrário, poderá ocorrer um erro:
[STAThread]public static void Main(){ ...}
Você deve fornecer um número válido de ID do projeto do cliente como parâmetro de entrada. No entanto, é possível escolher a licença que será usada no processamento chamando o método SetCurrentLicense do objeto Engine antes de qualquer um dos métodos de processamento. Use o método GetAvailableLicenses para consultar a lista de licenças ativadas disponíveis para uso e a propriedade CurrentLicense do objeto Engine para verificar qual licença já está selecionada.
// Inicialize estas variáveis com o caminho para FREngine.dll, o ID do projeto do cliente do FineReader Engine,// e, se aplicável, o caminho para o token da Licença Online e a senha da Licença Onlinewchar_t* FreDllPath;wchar_t* CustomerProjectId;wchar_t* LicensePath; // caso você não use uma Licença Online, atribua strings vazias a estas variáveiswchar_t* LicensePassword;// HANDLE de FREngine.dllstatic HMODULE libraryHandle = 0;// Objeto global do FineReader Engine.FREngine::IEnginePtr Engine;void LoadFREngine(){ if( Engine != 0 ) { // Já carregado return; } // Primeira etapa: carregar FREngine.dll if( libraryHandle == 0 ) { libraryHandle = LoadLibraryEx( FreDllPath, 0, LOAD_WITH_ALTERED_SEARCH_PATH ); if( libraryHandle == 0 ) { throw L"Erro ao carregar o ABBYY FineReader Engine"; } } // Segunda etapa: obter o objeto Engine typedef HRESULT ( STDAPICALLTYPE* InitializeEngineFunc )( BSTR, BSTR, BSTR, BSTR, BSTR, VARIANT_BOOL, FREngine::IEngine** ); InitializeEngineFunc pInitializeEngine = ( InitializeEngineFunc )GetProcAddress( libraryHandle, "InitializeEngine" ); if( pInitializeEngine == 0 || pInitializeEngine( CustomerProjectId, LicensePath, LicensePassword, L"", L"", VARIANT_FALSE, &Engine ) != S_OK ) { UnloadFREngine(); throw L"Erro ao carregar o ABBYY FineReader Engine"; }}
Código C#
public class EngineLoader : IDisposable{ public EngineLoader() { // Inicialize estas variáveis com o caminho completo para FREngine.dll, seu ID do projeto do cliente // e, se aplicável, o caminho para o arquivo de token da Licença Online e a senha da Licença Online string enginePath = ""; string customerProjectId = ""; string licensePath = ""; string licensePassword = ""; // Carregue a biblioteca FREngine.dll dllHandle = LoadLibraryEx(enginePath, IntPtr.Zero, LOAD_WITH_ALTERED_SEARCH_PATH); try { if (dllHandle == IntPtr.Zero) { throw new Exception("Can't load " + enginePath); } IntPtr initializeEnginePtr = GetProcAddress(dllHandle, "InitializeEngine"); if (initializeEnginePtr == IntPtr.Zero) { throw new Exception("Can't find InitializeEngine function"); } IntPtr deinitializeEnginePtr = GetProcAddress(dllHandle, "DeinitializeEngine"); if (deinitializeEnginePtr == IntPtr.Zero) { throw new Exception("Can't find DeinitializeEngine function"); } IntPtr dllCanUnloadNowPtr = GetProcAddress(dllHandle, "DllCanUnloadNow"); if (dllCanUnloadNowPtr == IntPtr.Zero) { throw new Exception("Can't find DllCanUnloadNow function"); } // Converta os ponteiros em delegates initializeEngine = (InitializeEngine)Marshal.GetDelegateForFunctionPointer( initializeEnginePtr, typeof(InitializeEngine)); deinitializeEngine = (DeinitializeEngine)Marshal.GetDelegateForFunctionPointer( deinitializeEnginePtr, typeof(DeinitializeEngine)); dllCanUnloadNow = (DllCanUnloadNow)Marshal.GetDelegateForFunctionPointer( dllCanUnloadNowPtr, typeof(DllCanUnloadNow)); // Chame a função InitializeEngine // passando o caminho para o arquivo da Licença Online e a senha da Licença Online int hresult = initializeEngine(customerProjectId, licensePath, licensePassword, "", "", false, ref engine); Marshal.ThrowExceptionForHR(hresult); } catch (Exception) { // Libere a biblioteca FREngine.dll engine = null; // Exclua todos os objetos antes de chamar FreeLibrary GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); FreeLibrary(dllHandle); dllHandle = IntPtr.Zero; initializeEngine = null; deinitializeEngine = null; dllCanUnloadNow = null; throw; } } // Funções da Kernel32.dll [DllImport("kernel32.dll")] private static extern IntPtr LoadLibraryEx(string dllToLoad, IntPtr reserved, uint flags); private const uint LOAD_WITH_ALTERED_SEARCH_PATH = 0x00000008; [DllImport("kernel32.dll")] private static extern IntPtr GetProcAddress(IntPtr hModule, string procedureName); [DllImport("kernel32.dll")] private static extern bool FreeLibrary(IntPtr hModule); // Funções da FREngine.dll [UnmanagedFunctionPointer(CallingConvention.StdCall, CharSet = CharSet.Unicode)] private delegate int InitializeEngine(string customerProjectId, string licensePath, string licensePassword, string tempFolder, string dataFolder, bool isSharedCPUCoresMode, ref FREngine.IEngine engine); [UnmanagedFunctionPointer(CallingConvention.StdCall)] private delegate int DeinitializeEngine(); [UnmanagedFunctionPointer(CallingConvention.StdCall)] private delegate int DllCanUnloadNow(); // Variáveis privadas private FREngine.IEngine engine = null; // Handle de FREngine.dll private IntPtr dllHandle = IntPtr.Zero; private InitializeEngine initializeEngine = null; private DeinitializeEngine deinitializeEngine = null; private DllCanUnloadNow dllCanUnloadNow = null;}