Menerapkan DllMain Parser

Network Monitor menggunakan fungsi ekspor DllMain untuk mengidentifikasi keberadaan pengurai, dan membebaskan sumber daya yang digunakan Network Monitor untuk menyimpan informasi tentang pengurai.

Saat Network Monitor memanggil DllMain untuk pertama kalinya, DLL pengurai memanggil CreateProtocol untuk melakukan hal berikut:

  • Tentukan protokol yang dideteksi pengurai.
  • Berikan titik masuk untuk fungsi ekspor pengurai yang tersisa yang dipanggil Monitor Jaringan.

Saat Network Monitor memanggil DllMain untuk terakhir kalinya, DllMain memanggil DestroyProtocol untuk melepaskan semua sumber daya yang digunakan oleh Network Monitor untuk menyimpan informasi tentang pengurai.

Prosedur berikut mengidentifikasi langkah-langkah yang diperlukan untuk menerapkan DllMain.

Untuk menerapkan DllMain

  1. Tentukan struktur ENTRYPOINTS untuk fungsi CreateProtocol dan variabel Attach global. Variabel Lampirkan digunakan untuk melacak jumlah instans protokol yang sedang berjalan.

  2. Lihat nilai parameter Komando yang ditetapkan oleh sistem operasi.

    Jika parameter Perintah diatur ke DLL_PROCESS_ATTACH dan Attach bernilai 0, maka panggil CreateProtocol untuk menyediakan nama protokol dan titik masuk untuk fungsi ekspor berikut.

    • Daftarkan
    • Batalkan pendaftaran
    • RecognizeFrame
    • AttachProperties
    • FormatProperties (hanya diperlukan jika Monitor Jaringan akan menampilkan properti protokol).

    Jika parameter Perintah diatur ke DLL_PROCESS_DETACH dan Attach adalah 0, maka panggil DestroyProtocol menggunakan handle instans yang dikembalikan oleh CreateProtocol.

  3. Mengembalikan TRUE karena fungsi pengurai DllMain harus selalu mengembalikan TRUE.

Berikut ini adalah implementasi dasar DllMain. Contoh kode menggunakan pernyataan kasus (case statement) untuk menangkap nilai dari parameter perintah untuk menentukan apakah CreateProtocol atau DestroyProtocol harus dipanggil.

#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;
}