Pular para o conteúdo principal
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.

Sintaxe

C++

HRESULT __stdcall InitializeEngine(
  BSTR CustomerProjectID,
  BSTR LicensePath,
  BSTR LicensePassword,
  BSTR FREngineDataFolder,
  BSTR FREngineTempFolder,
  VARIANT_BOOL IsSharedCPUCoresMode,
  IEngine** Engine
);

C#

int InitializeEngine(
  string CustomerProjectID,
  string LicensePath,
  string LicensePassword,
  string FREngineDataFolder,
  string FREngineTempFolder,
  bool IsSharedCPUCoresMode,
  ref IEngine Engine
);

Visual Basic .NET

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

Parâmetros

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 data Além disso, para Linux e Windows: %ProgramData%\ABBYY\SDK\12\Licenses for license data Se 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.

Valores de retorno

A função pode retornar os valores de retorno padrão das funções do ABBYY FineReader Engine.

Observações

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.

Exemplos

// 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 Online
wchar_t* FreDllPath;
wchar_t* CustomerProjectId;
wchar_t* LicensePath;  // caso você não use uma Licença Online, atribua strings vazias a estas variáveis
wchar_t* LicensePassword;
// HANDLE de FREngine.dll
static 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";
    }
}
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;
}
A função é usada em todos os exemplos de código, exceto EnginesPool (Win).

Veja também

Licenciamento Módulos DeinitializeEngine Diferentes formas de carregar o objeto Engine (Win)