Udostępnij za pośrednictwem


Zachowanie biblioteki czasu wykonywania

C/C++ wykonuje kod biblioteki wykonawczej DLL sekwencji rozruchowej, eliminując konieczność powiązania z oddzielny moduł jako było konieczne w systemie Windows 3.x.W języku C/C++ kod biblioteki wykonawczej jest wywołana funkcja punktu wejścia biblioteki DLL _DllMainCRTStartup._DllMainCRTStartup funkcja wykonuje kilka operacji, łącznie z telefoniczną _CRT_INIT, który inicjuje biblioteki wykonawczej języka C/C++ i wywołuje konstruktorów C++ na zmienne statyczne, nielokalnego.Bez tej funkcji biblioteki wykonawczej pozostawiono w stanie Niezainicjowany._CRT_INIT jest dostępne dla obu statycznie CRT lub zawierająca łącza do CRT DLL Msvcr90.dll, od użytkownika DLL.

Choć jest możliwe określenie innej funkcji punktu wejścia przy użyciu /ENTRY: opcja linker nie zaleca ponieważ funkcja punktu wejścia musieliby zduplikowane wszystko który _DllMainCRTStartup czy.Konstruując biblioteki dll w programie Visual C++, _DllMainCRTStartup jest połączony automatycznie i nie trzeba określać funkcję punktu wejścia przy użyciu /ENTRY: opcja linker.

Oprócz inicjowania biblioteki wykonawczej C, _DllMainCRTStartup wywołuje funkcję o nazwie DllMain.W zależności od rodzaju DLL tworzysz, zawiera Visual C++ DllMain dla Ciebie i pobiera powiązane w tak, aby _DllMainCRTStartup zawsze ma coś do rozmowy.W ten sposób Jeśli nie trzeba zainicjować biblioteki DLL nie ma specjalnych, co musisz zrobić podczas tworzenia biblioteki DLL.Jeśli trzeba zainicjować biblioteki DLL, gdzie możesz dodać swój kod zależy od rodzaju DLL pisania.Aby uzyskać więcej informacji, zobacz inicjowania biblioteki DLL.

Kod biblioteki wykonawczej języka C/C++ konstruktory i destruktory wzywa zmienne statyczne, nielokalnego.Na przykład, w kodzie źródłowym DLL następujące Equus i Sugar są dwie statyczne, nielokalne obiekty klasy CHorse, zdefiniowany w Horses.h.Nie ma żadnej funkcji w kod źródłowy, który zawiera wywołań funkcji konstruktora dla CHorse lub zostanie on działać, ponieważ obiekty te są zdefiniowane poza jakąkolwiek funkcją.W związku z tym odwołanie do tych konstruktory i destruktory musi być wykonane przez kod wykonywalny.Kod biblioteki wykonawczej dla aplikacji wykonuje również tę funkcję.

#include "horses.h"

CHorse  Equus( ARABIAN, MALE );
CHorse  Sugar( THOROUGHBRED, FEMALE );

BOOL    WINAPI   DllMain (HANDLE hInst, 
                            ULONG ul_reason_for_call,
                            LPVOID lpReserved)
...

Za każdym razem nowy proces próbuje użyć biblioteki DLL, system operacyjny tworzy osobną kopię danych biblioteki DLL: jest to proces dołączania.Kod biblioteki dll wywołuje konstruktory dla wszystkich obiektów globalnych, jeśli istnieje, a następnie wywołuje DllMain dołączania funkcji z procesem wybranego.Przeciwnej sytuacji jest proces odłączyć: wywołania kodu biblioteki wykonawczej DllMain z procesem odłączyć zaznaczone, a następnie wywołuje listę funkcji rozwiązania, w tym atexit funkcje, destruktory obiektów globalnych i destruktory obiektów statycznych.Należy pamiętać, że kolejność zdarzeń w procesie dołączyć to odłączyć odwrócenia w procesie.

Kod biblioteki wykonawczej nazywa się również podczas Dołącz wątek i odłączyć wątku, ale kod wykonywalny nie nie inicjowania lub zakończenie samodzielnie.

Co chcesz zrobić?

Zobacz też

Koncepcje

Biblioteki DLL w programie Visual C++