Udostępnij za pośrednictwem


Inicjowanie biblioteki DLL rozszerzenia

Ponieważ rozszerzenie DLL nie jest CWinApp-uzyskane obiekt (tak jak regularne dll), należy dodać kod inicjowania i Zakończenie do DllMain funkcji generującej kreatora MFC DLL.

Kreator udostępnia następujący kod 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, aby wyeksportować CRuntimeClass obiektów lub zasobów do aplikacji klienta.

Jeśli zamierzasz na rozszerzenie DLL z jednego lub więcej regularnych biblioteki DLL, należy wyeksportować funkcji inicjowania, który tworzy CDynLinkLibrary obiektu.Aby funkcja musi być wywołana z każdego z regularnych biblioteki DLL, które mają rozszerzenie DLL.Znajduje się w odpowiednim miejscu, aby wywołać funkcję inicjowania InitInstance Członkowskich funkcji DLL regularne CWinApp-uzyskane obiekt przed wykorzystaniem klas wywożonych lub funkcji DLL rozszerzenia.

W DllMain że MFC DLL Kreator generuje, wywołanie AfxInitExtensionModule przechwytuje klasy uruchomieniowej modułu (CRuntimeClass struktury) 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 zwracana jest wartość zero z AfxInitExtensionModule, zwrócić zero z programu DllMain funkcji.

Jeśli Twoje biblioteki DLL rozszerzenia zostanie jawnie połączony plik wykonywalny (co oznacza wykonywalny wywołania AfxLoadLibrary połączyć z biblioteki DLL), należy dodać wywołanie AfxTermExtensionModule na DLL_PROCESS_DETACH.Ta funkcja umożliwia MFC oczyścić bibliotekę DLL rozszerzenia podczas każdego procesu odłącza z biblioteki DLL rozszerzenia (które się dzieje, kiedy proces lub gdy biblioteka DLL jest wyładowane w wyniku AfxFreeLibrary wywołania).Jeśli biblioteka DLL rozszerzenia sieci zostanie połączony 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 (zamiast funkcji Win32 LoadLibrary i FreeLibrary) Jeśli aplikacja korzysta z wielu wątków.Za pomocą AfxLoadLibrary i AfxFreeLibrary zapewnia, że kod uruchamiania i zamykania, który wykonuje, gdy rozszerzenie DLL jest załadowane oraz 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 DllMain (w przeciwieństwie do 16-bitową wersję MFC).

Biblioteki DLL rozszerzenia można opiekę nad wielowątkowości obsługa DLL_THREAD_ATTACH i DLL_THREAD_DETACH przypadkach w DllMain funkcji.Te przypadki są przekazywane do DllMain gdy wątki dołączyć i odłączyć od biblioteki DLL.Wywołanie TlsAlloc gdy biblioteka DLL jest dołączenie pozwala DLL utrzymanie wątek indeksuje Magazyn lokalny (TLS) dla każdego wątku dołączonych do biblioteki DLL.

Należy zauważyć, że plik nagłówkowy Afxdllx.h zawiera szczególne definicje struktury biblioteki DLL rozszerzenia, takie jak definicja AFX_EXTENSION_MODULE i CDynLinkLibrary.Twoje bibliotece DLL rozszerzenia należy dołączyć ten plik nagłówkowy.

[!UWAGA]

Jest ważne, że można zdefiniować ani nie zdefiniowany dowolną 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 na http://search.support.microsoft.com/.

Funkcja inicjowania próbki, zawarty w uchwyty wielowątkowości Za pomocą wątku lokalnego magazynu w bibliotece DLL 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 uruchomieniowej MFC i C.

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

Co chcesz zrobić?

Co chcesz wiedzieć więcej?

Zobacz też

Koncepcje

Inicjowanie biblioteki DLL