> ## Documentation Index
> Fetch the complete documentation index at: https://docs.abbyy.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Engine Object をロードするさまざまな方法

> Windows で ABBYY FineReader Engine オブジェクトをロードする 3 つの方法: FREngine.dll を直接ロードする方法、InprocLoader を使用した COM インプロセス、またはサーバーシナリオ向けに OutprocLoader を使用した アウトプロセス。

<Note>
  このトピックは Windows 版の FRE に適用されます。
</Note>

ABBYY FineReader Engine 12 で [Engine](/ja/fine-reader/engine/api-reference/engine-object-iengine-interface) オブジェクトをロードする方法は 3 つあります。これらのロード方法にはそれぞれ特有の違いがあり、状況に応じたオブジェクトの使い方に影響します。最初の 2 つの方法は、複数のリクエストを同時に処理することを想定していない対話型アプリケーションでの使用に最も適しています。3 つ目の方法は、サーバーソリューションに最も適しています。

<div id="loading-frenginedll-manually-and-working-with-naked-interfaces">
  ## FREngine.dll を手動でロードし、「生の」インターフェイスを使用する
</div>

これは、Engine オブジェクトをロードするための標準的なメソッドです。Engine オブジェクトへの参照を取得するには、[InitializeEngine](/ja/fine-reader/engine/api-reference/functions/initializeengine-function) 関数を呼び出します。

<table><thead><tr><th><p>利点</p></th><th><p>制限事項</p></th></tr></thead><tbody><tr><td><ul><li>最高のパフォーマンスが得られます。</li><li>FREngine.dll を登録する必要はありません。</li></ul></td><td><ul><li>マルチスレッド アプリケーションでの使用には制限があります (<a href="/ja/fine-reader/engine/guided-tour/advanced-techniques/programming-aspects/using-in-server-applications">マルチスレッド サーバー アプリケーションで ABBYY FineReader Engine を使用する</a> を参照してください) 。</li><li>高水準言語 (たとえば .NET) を使用する場合は、動的ライブラリのロードや、そこで公開されている関数の呼び出しに低水準の手段を使用する必要があります。</li></ul></td></tr></tbody></table>

<Accordion title="C# コード">
  ```csharp theme={null}
  public class EngineLoader : IDisposable
  {
      public EngineLoader()
      {
          // これらの変数を、FREngine.dll へのフル パス、Customer Project ID、
          // および該当する場合は、オンライン ライセンス トークン ファイルへのパスとオンライン ライセンスのパスワードで初期化します
          string enginePath = "";
          string customerProjectId = "";
          string licensePath = "";
          string licensePassword = "";
          // 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");
              }
              // ポインターをデリゲートに変換します
              initializeEngine = (InitializeEngine)Marshal.GetDelegateForFunctionPointer(
                  initializeEnginePtr, typeof(InitializeEngine));
              deinitializeEngine = (DeinitializeEngine)Marshal.GetDelegateForFunctionPointer(
                  deinitializeEnginePtr, typeof(DeinitializeEngine));
              dllCanUnloadNow = (DllCanUnloadNow)Marshal.GetDelegateForFunctionPointer(
                  dllCanUnloadNowPtr, typeof(DllCanUnloadNow));
              // オンライン ライセンス ファイルへのパスとオンライン ライセンスのパスワードを渡して
              // InitializeEngine 関数を呼び出します
              int hresult = initializeEngine(customerProjectId, licensePath, licensePassword, 
                  "", "", false, ref engine);
              Marshal.ThrowExceptionForHR(hresult);
          }
          catch (Exception)
          {
              // FREngine.dll ライブラリを解放します
              engine = null;
              // FreeLibrary の呼び出し前にすべてのオブジェクトを削除します
              GC.Collect();
              GC.WaitForPendingFinalizers();
              GC.Collect();
              FreeLibrary(dllHandle);
              dllHandle = IntPtr.Zero;
              initializeEngine = null;
              deinitializeEngine = null;
              dllCanUnloadNow = null;
              throw;
          }
      }
      // 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);
      // 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();
      // 非公開変数
      private FREngine.IEngine engine = null;
      // FREngine.dll へのハンドル
      private IntPtr dllHandle = IntPtr.Zero;
      private InitializeEngine initializeEngine = null;
      private DeinitializeEngine deinitializeEngine = null;
      private DllCanUnloadNow dllCanUnloadNow = null;
  }
  ```
</Accordion>

<div id="loading-the-engine-object-by-means-of-com-into-the-current-process">
  ## COM を使用して現在のプロセスに Engine object をロードする
</div>

Engine は、アプリケーションが実行されているのと同じプロセス内に、インプロセス サーバーとしてロードされます。Engine object は、[IEngineLoader](/ja/fine-reader/engine/api-reference/engine-loaders/iengineloader) インターフェイスを実装する [InprocLoader](/ja/fine-reader/engine/api-reference/engine-loaders/inprocloader) object を使用してロードされます。

<table><thead><tr><th><p>利点</p></th><th><p>制限事項</p></th></tr></thead><tbody><tr><td><ul><li>すべての ABBYY FineReader Engine object は完全にスレッドセーフであり、異なるスレッドで作成して使用できます。</li><li>メインの STA アパートメントから使用する場合、パフォーマンスは生のインターフェイスを使用する場合と同等です。異なるスレッドからアクセスすると マーシャリングオーバーヘッド が発生することがありますが、ほとんどのシナリオでは無視できる程度です。</li></ul></td><td><ul><li>エンドユーザーのコンピューターに最終アプリケーションをインストールする際には、FREngine.dll の登録が必要です。</li></ul></td></tr></tbody></table>

<Accordion title="C# コード">
  ```csharp theme={null}
  IEngineLoader engineLoader = new FREngine.InprocLoader();
  IEngine engine = engineLoader.InitializeEngine( customerProjectId, licensePath, licensePassword, "", "", false );
  try {
   ...
  } finally {
   engineLoader.ExplicitlyUnload();
  }
  ```
</Accordion>

<Note>
  エンドユーザーのコンピューターにアプリケーションをインストールする際に FREngine.dll を登録するには、regsvr32 ユーティリティを使用します。64 ビット オペレーティング システムでは、既定で 64 ビット版の regsvr32 が実行されます。次のコマンドラインを使用してください。
</Note>

```csharp theme={null}
regsvr32 /s /n /i:"<path to the Inc folder>" "<path to FREngine.dll>"
```

<div id="loading-the-engine-object-by-means-of-com-into-a-separate-process">
  ## COM を使用して Engine オブジェクトを別プロセスにロードする
</div>

Engine は、アウトプロセスサーバーとして別プロセスにロードされます。Engine オブジェクトは、[IEngineLoader](/ja/fine-reader/engine/api-reference/engine-loaders/iengineloader) インターフェイスを実装する [OutprocLoader](/ja/fine-reader/engine/api-reference/engine-loaders/outprocloader) オブジェクトによってロードされます。

<table><thead><tr><th><p>利点</p></th><th><p>制限事項</p></th></tr></thead><tbody><tr><td><ul><li>すべての ABBYY FineReader Engine オブジェクトは完全にスレッドセーフです。Engine の各インスタンスは、それぞれ別プロセスで他のインスタンスと並行して実行されます。</li><li>コンピューターの CPU 性能を最大限に活用できるよう、プロセッサのプールを構成できます。</li></ul></td><td><ul><li>わずかなマーシャリングオーバーヘッドがあります。</li><li>エンドユーザーのコンピューターに最終アプリケーションをインストールする際は、FREngine.dll の登録が必要です。</li><li>権限が制限されたアカウントで作業する場合は、必要な権限を付与する必要があります。</li><li>ページ画像に HBITMAP としてアクセスすることはできません。</li><li>Visual Components は複数プロセスでは動作しないため、使用できません。</li></ul></td></tr></tbody></table>

<Accordion title="C# コード">
  ```csharp theme={null}
  IEngineLoader engineLoader = new FREngine.OutprocLoader();
  IEngine engine = engineLoader.InitializeEngine( customerProjectId, licensePath, licensePassword, "", "", false);
  try {
   ...
  } finally {
   engineLoader.ExplicitlyUnload();
  }
  ```
</Accordion>

この Engine オブジェクトのロード方法は、特に、マルチスレッドアプリケーション向けの再利用可能なソリューションを提供する [EnginesPool](/ja/fine-reader/engine/guided-tour/samples#enginespool) コードサンプルで使用されています。

* アカウント権限は DCOM Config ユーティリティを使用して設定できます (コマンドラインで DCOMCNFG と入力するか、\[コントロール パネル] > \[管理ツール] > \[コンポーネント サービス] を選択します) 。コンソールツリーで \[コンポーネント サービス] > \[コンピューター] > \[マイ コンピューター] > \[DCOM Config] フォルダーを見つけ、ABBYY FineReader Engine 12.5 Loader (Local Server) を右クリックして \[Properties] をクリックします。ダイアログが開きます。\[Security] タブをクリックします。\[Launch Permissions] で \[Customize] をクリックし、次に \[Edit] をクリックして、アプリケーションを起動できるアカウントを指定します。

<Note>
  64 ビット オペレーティング システムでは、登録された DCOM アプリケーションは 32 ビット MMC コンソールで使用でき、このコンソールは次のコマンドラインで実行できます。
</Note>

```
"mmc comexp.msc /32"
```

* エンドユーザーのコンピューターにアプリケーションをインストールする際に FREngine.dll を登録するには、regsvr32 ユーティリティを使用します。64 ビット オペレーティング システムでは、既定で 64 ビット版の regsvr32 が実行されます。次のコマンドラインを使用してください:

```csharp theme={null}
regsvr32 /s /n /i:"<path to the Inc folder>" "<path to FREngine.dll>"
```

* サーバーアプリケーションのデバッグ時にも実行時にも、Network license を使用することをお勧めします。

さらに、[IHostProcessControl](/ja/fine-reader/engine/api-reference/engine-loaders/ihostprocesscontrol) インターフェイスを使用して、ホストプロセスの優先度を管理し、稼働状態を制御できます。

<div id="comparison-table">
  ## 比較表
</div>

以下の表は、3 つのロード方法の特性をまとめたものです。

| 特性                                        | 生のインターフェイス | インプロセスサーバー | アウトプロセスサーバー |
| ----------------------------------------- | ---------- | ---------- | ----------- |
| プロキシなしで動作する (マーシャリング オーバーヘッドなし)           | はい         | 制限があります    | いいえ         |
| マルチスレッド アプリケーションで動作する                     | 制限があります    | はい         | はい          |
| プロセスを並列実行できる (サーバー ソリューション向け)             | いいえ        | いいえ        | はい          |
| FREngine.dll の登録が不要                       | はい         | いいえ        | いいえ         |
| 実行権限を設定する必要がない                            | はい         | はい         | いいえ         |
| `new` 演算子を使用してオブジェクトを作成できる。スクリプトからも使用できる。 | いいえ        | はい         | はい          |
| ページ画像に HBITMAP としてアクセスできる                 | はい         | はい         | いいえ         |
| 別プロセスで動作する (フェールセーフ、リサイクル)                | いいえ        | いいえ        | はい          |
| Visual Components と併用できる                  | はい         | はい         | いいえ         |

<div id="see-also">
  ## 関連項目
</div>

[ABBYY FineReader Engine をマルチスレッド サーバー アプリケーションで使用する](/ja/fine-reader/engine/guided-tour/advanced-techniques/programming-aspects/using-in-server-applications)
