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četě 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 provádí _DllMainCRTStartup. Při vytváření DLL knihovnen v aplikaci Visual C++, je automaticky propojena _DllMainCRTStartup a nemusíte specifikovat 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 Vaší DLL knihovnu, zde není nic zváštního, co musíte udělat, při vytváření Vaší DLL knihovny. 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 zdojové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ž se pokouší nový proces použít DLL knihovnu, vytvoří operační systém samostatnou kopii data DLL knihovny: to se nazývá přidělení procesu. 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 odebrání procesu: kód běhové knihovny volá DllMain s vybraným odebráním procesu 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