Sdílet prostřednictvím


Chování běhové knihovny

Kód běhové knihovny jazyka C/C++ provádí spouštěcí sekvenci knihovny DLL, aniž by je bylo nutné připojit se samostatným modulem, jak to bylo nezbytné v systému Windows 3.x.V kódu běhové knihovny jazyka C/C++ je zahrnuta funkce vstupního bodu knihovny DLL, nazvaná _DllMainCRTStartup.Funkce _DllMainCRTStartup provádí některé věci, včetně volání _CRT_INIT, které inicializuje běhovou knihovnu jazyka C/C++ a vyvolá C++ konstruktory na statické a nemístní proměnné.Bez této funkce by zůstala běhová knihovna ve neinicializovaném stavu._CRT_INIT je k dispozici pro staticky propojené CRT nebo propojení do knihovny CRT DLL Msvcr90.dll, z uživatelské knihovny DLL.

I když je možné zadat jinou funkci vstupního bodu použitím/ENTRY: možností propojovacího programu, to se nedoporučuje, protože funkce vstupního bodu by musela duplikovat vše, co která _DllMainCRTStartup nemá.Při vytváření DLL knihovnen v aplikaci Visual C++, _DllMainCRTStartup je automaticky propojena a není nutné zadat funkci vstupního bodu použitím/ENTRY: možností propojovacího programu.

Kromě toho k inicializaci běhové knihovny jazyka C volá _DllMainCRTStartup funkci, nazvanou DllMain. V závislosti na druhu DLL knihovny, kterou vytváříte, Vám poskytuje Visual C++ DllMain a získá propojení tak, aby mělo _DllMainCRTStartup vždy co volat.Tímto způsobem, pokud nepotřebujete inicializovat DLL knihovnu, zde není nic zvláštního, co musíte udělat při vytváření knihovny DLL.Potřebujete-li inicializovat Vaší DLL knihovnu, závisí přidání Vašeho kódu na druhu DLL knihovny, kterou píšete.Další informace naleznete v tématu Inicializace knihovny DLL.

Kód běhové knihovny jazyka C/C++ volá konstruktory a destruktory na statické a nemístní proměnné.Například ve zdrojovém kódu DLL knihovny, jsou Equus a Sugar dva statické a nemístní objekty třídy CHorse, definované v Horses.h. Ve zdrojovém kódu není žádná další funkce, která obsahuje volání konstruktoru funkce pro CHorse nebo destruktoru funkce, protože tyto objekty jsou definovány mimo jakoukoliv funkci.Proto musí být volání těchto konstruktorů a destruktorů provedeny kódem za běhu.Kód běhové knihovny pro aplikace také provádí tuto funkci.

#include "horses.h"

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

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

Pokaždé, když nový proces pokusí použít DLL Knihovnu, vytvoří operační systém samostatnou kopii data DLL Knihoven: to se nazývá proces připojení.Kód běhové knihovny pro DLL knihovnu volá konstruktory pro všechny globální objekty, pokud existují, a poté zavolá funkci DllMain s vybraným přidělením procesu. Opačnou situací je proces odpojení: Kód běhové knihovny volá DllMain s procesem odpojit vybrali a poté volá seznam ukončených funkcí, včetně atexit funkcí, desktruktorů pro globální obejtky a destruktorů pro statické objekty.Všimněte si, že pořadí událostí v přidělování procesu je opačné k procesu odebrání procesu.

Kód běhové knihovny je také volán během přidělení a odebrání vlákna, ale běhový kód neprovádí žádné vlastní inicializace nebo ukončení.

Co chcete udělat?

Viz také

Koncepty

Knihovny DLL v jazyce Visual C++