Inicjowanie bibliotek DLL rozszerzeń

Ponieważ rozszerzenie dll nie mają CWinApp-pochodnych obiektu (tak jak regularne pliki dll), należy dodać kodu inicjowania i Zakończenie do DllMain funkcji generującej MFC DLL kreatora.

Kreator udostępnia następujące kodu dla bibliotek DLL rozszerzeń.W kodzie PROJNAME jest symbolem zastępczym dla nazwy projektu.

#include "stdafx.h"
#include <afxdllx.h>

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
static AFX_EXTENSION_MODULE PROJNAMEDLL = { NULL, NULL };

extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
   if (dwReason == DLL_PROCESS_ATTACH)
   {
      TRACE0("PROJNAME.DLL Initializing!\n");
      
      // Extension DLL one-time initialization
      AfxInitExtensionModule(PROJNAMEDLL, 
                                 hInstance);

      // Insert this DLL into the resource chain
      new CDynLinkLibrary(Dll3DLL);
   }
   else if (dwReason == DLL_PROCESS_DETACH)
   {
      TRACE0("PROJNAME.DLL Terminating!\n");
   }
   return 1;   // ok
}

Tworzenie nowego CDynLinkLibrary obiektu podczas inicjowania umożliwia rozszerzenie DLL do wyeksportowania CRuntimeClass obiektów lub zasobów do aplikacji klienta.

Jeśli zamierzasz użyć swojego rozszerzenie DLL z jednego lub więcej regularnych biblioteki dll, należy wyeksportować funkcję inicjalizacji, która tworzy CDynLinkLibrary obiektu.Ta funkcja musi być wywołana z każdym z regularnych biblioteki dll, które mają rozszerzenie DLL.Odpowiednie miejsce do wywołania tej funkcji inicjującej znajduje się w InitInstance funkcji składowej regularnych biblioteki dll CWinApp-pochodnych obiektu przed wykorzystaniem klas wywożonych lub funkcji DLL rozszerzenia.

W DllMain że MFC DLL Kreator generuje, wywołanie AfxInitExtensionModule przechwytuje moduł wykonawczy klas (CRuntimeClass struktur) jak również jego fabryk obiektu (COleObjectFactory obiektów) do użytku w CDynLinkLibrary tworzony jest obiekt.Należy sprawdzić wartość zwracaną przez AfxInitExtensionModule; Jeśli wartość zero jest zwracane z AfxInitExtensionModule, zwraca wartość zero z sieci DllMain funkcji.

Jeśli biblioteka DLL rozszerzenia zostanie jawnie połączony plik wykonywalny (co oznacza wykonywalny wywołania AfxLoadLibrary Aby utworzyć łącze do pliku DLL), należy dodać wywołanie AfxTermExtensionModule na komunikat DLL_PROCESS_DETACH.Dzięki tej funkcji MFC czyszczenie biblioteki DLL rozszerzenia, podczas każdego procesu odłącza z biblioteki DLL rozszerzenia (co zdarza się, gdy kończy proces lub biblioteki DLL jest wyładowane w rezultacie AfxFreeLibrary call).Jeśli biblioteka DLL rozszerzenia będzie powiązana niejawnie aplikacji, wywołanie AfxTermExtensionModule nie jest konieczne.

Aplikacje, które jawnie wywołać łącze do biblioteki DLL rozszerzenia AfxTermExtensionModule podczas zwalniania biblioteki DLL.Ponadto powinny używać AfxLoadLibrary i AfxFreeLibrary (a nie funkcji Win32 LoadLibrary i FreeLibrary) Jeśli aplikacja używa wielu wątków.Za pomocą AfxLoadLibrary i AfxFreeLibrary zapewnia, że kod uruchamiania i zamykania, który wykonuje, gdy rozszerzenie DLL jest załadowane lub wyładowane nie doprowadzić do uszkodzenia globalnego MFC.

Ponieważ MFCx0.dll jest w pełni zainicjowany przez czas DllMain jest wywoływana, można przydzielić pamięci i wywoływać funkcje MFC w ramach DllMain (w przeciwieństwie do wersji 16-bitowej biblioteki MFC).

Biblioteki DLL rozszerzenia może zająć wielowątkowości Obsługa DLL_THREAD_ATTACH i DLL_THREAD_DETACH przypadki, w DllMain funkcji.Te przypadki są przekazywane do DllMain kiedy wątki dołączanie lub odłączanie od biblioteki DLL.Wywołanie TlsAlloc podczas dołączania biblioteki DLL pozwala biblioteki DLL, obsługa wątku Magazyn lokalny (TLS) indeksuje każdy wątek dołączonych do biblioteki DLL.

Należy zauważyć, że pliku nagłówka Afxdllx.h zawiera szczególne definicje struktur używane w bibliotekach DLL rozszerzenia, takie jak definicja AFX_EXTENSION_MODULE i CDynLinkLibrary.Biblioteka DLL rozszerzenia powinny obejmować ten plik nagłówka.

[!UWAGA]

Jest to ważne, że można określić ani nie zdefiniowany żadnego z makra _AFX_NO_XXX w Stdafx.h.Aby uzyskać więcej informacji, zobacz artykuł bazy wiedzy Knowledge Base "PRB: wystąpić problemy podczas definiowania _AFX_NO_XXX" (Q140751).Artykuły bazy wiedzy Knowledge Base można znaleźć w bibliotece MSDN lub w http://search.support.microsoft.com/.

Funkcja inicjowania próbki, uchwyty wielowątkowości zawarty w Za pomocą wątku Magazyn lokalny w dynamicznie dołączanej biblioteki w Windows SDK.Uwaga, że próbka zawiera funkcję punktu wejścia o nazwie LibMain, ale należy nadać nazwę tej funkcji DllMain , która działa z biblioteki run-time MFC i C.

Próbki MFC DLLHUSK zademonstrowano użycie funkcji inicjowania.

Co chcesz zrobić?

O czym chcesz się dowiedzieć więcej?

Zobacz też

Koncepcje

Inicjowanie biblioteki DLL