kod w sekcjach inicjalizacji jednostek w DLL będzie uruchamiany, gdy DLL jest najpierw załadowane do procesu. Sekcje finalizacji są uruchamiane, gdy biblioteka DLL jest usuwana z procesu.
Eugene ma rację, że można mieć kontrolę nad bardziej precyzyjną użyciu DLLProc ale zazwyczaj jest to potrzebne tylko dla zasobów per-wątku, na przykład wątku lokalnego magazynu.
Chciałbym zauważyć, że istnieją poważne ograniczenia co do tego, co można zrobić podczas DLLMain, gdzie ostatecznie sekcje inicjalizacyjne/końcowe powstają w bibliotece. Dokumentacja MSDN w zasadzie mówi, że możesz zrobić kilka rzeczy, ale nie ma listy akceptowalnych zachowań. Najbliższe jest powiedzenie, że możesz wywoływać funkcje w kernel32. W przeciwnym razie wszystkie zakłady są wyłączone!
Istnieje wiele artykułów w Internecie, które opisują problem, ale poza tematem MSDN dla DLLMain, który mam powyżej, polecam czytanie Microsoft's Best Practices for Creating DLLs.
Pomocny rada że MSDN oferuje to, że biblioteka może upoważnić, że jego użytkownicy wywołania funkcji inicjalizacji przed użyciem DLL. Odpowiednia funkcja finalizacji zostanie wywołana, gdy skończysz z DLL. Korzystanie z comctl32.dll przyjmuje ten idiom, patrz InitCommonControlsEx.
W moim własnym kodzie preferuję alternatywne podejście. Sekcje inicjalizacji wszystkich moich jednostek rejestrują metody inicjalizacji i finalizacji. Następnie przy pierwszym wywołaniu dowolnej wyeksportowanej funkcji z mojej biblioteki uruchamiane są metody inicjowania w kolejności, w jakiej zostały zarejestrowane.Nie jest to dla mnie problemem wdrożenie, ponieważ kontroluję już wszystkie punkty wejścia/wyjścia do mojej biblioteki.
Zdaję sobie sprawę, że jest to coś więcej, niż chciałeś, ale może ci się przydać, aby uniknąć problemów, które trudno rozwiązać.
+1. W skrócie, kod w sekcji finalizacji * zostanie * wywołany, ale z powodu blokady programu ładującego OS, możesz tego nie chcieć. Unikaj możliwego zakleszczenia: Eksportuj jawne funkcje inicjalizacji i finalizacji, aby proces hosta mógł wywołać. –
The Old New Thing wyjaśnia, dlaczego: http://blogs.msdn.com/b/oldnewthing/archive/2004/01/27/63401.aspx –
@Jeroen Miałem zamiar link do tego artykułu, ale to trochę jajko curate i artykuły, które Raymond łączy, wydają się być zjedzone przez zgniliznę MS link. Najlepszym odnośnikiem, jaki znalazłem, jest http://www.microsoft.com/whdc/driver/kernel/DLL_bestprac.mspx –