次の方法で共有


DllMain パーサーの実装

ネットワーク モニターは 、DllMain エクスポート関数を使用してパーサーの存在を識別し、Network Monitor がパーサーに関する情報を格納するために使用するリソースを解放します。

ネットワーク モニターが 初めて DllMain を呼び出すと、パーサー DLL は CreateProtocol を 呼び出して次の操作を行います。

  • パーサーが検出するプロトコルを指定します。
  • Network Monitor が呼び出す残りのパーサー エクスポート関数のエントリ ポイントを指定します。

ネットワーク モニターが最後に DllMain を 呼び出すと、 DllMainDestroyProtocol を呼び出して、Network Monitor がパーサーに関する情報を格納するために使用するすべてのリソースを解放します。

次の手順では、 DllMain を実装するために必要な手順を示します。

DllMain を実装するには

  1. CreateProtocol 関数とグローバル Attach 変数の ENTRYPOINTS 構造体を指定します。 Attach 変数は、実行中のプロトコル インスタンスの数を追跡するために使用されます。

  2. オペレーティング システムが設定する Command パラメーターの値を確認します。

    Command パラメーターが DLL_PROCESS_ATTACH に設定され、Attach が 0 の場合は、CreateProtocol を呼び出して、次のエクスポート関数のプロトコル名とエントリ ポイントを指定します。

    • [登録]
    • 登録解除
    • RecognizeFrame
    • AttachProperties
    • FormatProperties (ネットワーク モニターにプロトコル プロパティが表示される場合にのみ必要)。

    Command パラメーターが DLL_PROCESS_DETACH に設定され、Attach が 0 の場合は、CreateProtocol が返すインスタンス ハンドルを使用して DestroyProtocol を呼び出します。

  3. DllMain パーサー関数は常に TRUE を返す必要があるため、TRUE を返します。

DllMain の基本的な実装を次に示します。 このコード例では、case ステートメントを使用して Command パラメーターの値をトラップし、CreateProtocol または DestroyProtocol を呼び出す必要があるかどうかを判断します。

#include <windows.h>

// Entry point structure for parser export functions and global
// Attach variable.
ENTRYPOINTS EntryPoints =
{
  Register,
  Deregister,
  RecognizeFrame,
  AttachProperties,
  FormatProperties
};

DWORD Attached = 0; 

BOOL WINAPI DllMain(HANDLE hInstance, ULONG Command, LPVOID Reserved)
{
  switch(Command)
  {
  // Call CreateProtocol.
  case DLL_PROCESS_ATTACH:
       // Loading parser DLL.
       if(Attached == 0)
       {
         hProtocol = CreateProtocol( "ProtocolName",
                                     &EntryPoints,
                                     ENTRYPOINTS_SIZE);
       }
       Attached++;
       break;
  // Call DestroyProtocol.
  case DLL_PROCESS_DETACH:
       // Unloading parser DLL.
       Attached--;
       if(Attached == 0)
       {
         DestroyProtocol( hProtocol);
       }
       break;
  }
  return TRUE;
}