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.

Je možné zadat jinou funkci vstupního bodu pomocí /ENTRY: možnost linker není doporučeno protože funkce vstupní bod musel duplikovat všechny objekty, _DllMainCRTStartup nemá.Při vytváření knihovny DLL jazyka Visual C++ _DllMainCRTStartup je spojen v automaticky a není nutné zadávat funkci vstupního bodu pomocí /ENTRY: linker možnost.

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ž nový proces pokusí použít knihovnu DLL, operační systém vytvoří kopii dat na knihovnu DLL: proces se nazývá připojit.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čné situace je proces odpojit: volání knihovny běhu kódu DllMain s procesem odpojit vybraný a pak zavolá ukončení funkce, včetně atexit funkce, destruktory pro globální objekty a destruktory 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 jazyka Visual C++