Biblioteka DLL — często zadawane pytania

Czy biblioteka MFC DLL może tworzyć wiele wątków?

Z wyjątkiem podczas inicjowania biblioteka MFC DLL może bezpiecznie utworzyć wiele wątków, o ile używa ona funkcji lokalnego magazynu win32 wątku (TLS), takich jak TlsAlloc , aby przydzielić magazyn lokalny wątku. Jeśli jednak biblioteka MFC DLL używa __declspec(thread) do przydzielania lokalnego magazynu wątku, aplikacja kliencka musi być niejawnie połączona z biblioteką DLL. Jeśli aplikacja kliencka jawnie łączy się z biblioteką DLL, wywołanie biblioteki LoadLibrary nie spowoduje pomyślnego załadowania biblioteki DLL. Aby uzyskać więcej informacji na temat zmiennych lokalnych wątków w bibliotekach DLL, zobacz wątku.

Biblioteka MFC DLL tworząca nowy wątek MFC podczas uruchamiania przestanie odpowiadać podczas ładowania przez aplikację. Obejmuje to zawsze, gdy wątek jest tworzony przez wywołanie AfxBeginThread lub CWinThread::CreateThread wewnątrz:

  • CWinAppObiekt InitInstance -pochodny w regularnej biblioteki MFC DLL.

  • Podana DllMain funkcja RawDllMainw zwykłej bibliotece MFC DLL.

  • Podana DllMain funkcja RawDllMain w bibliotece DLL rozszerzenia MFC.

Czy aplikacja wielowątkowa może uzyskiwać dostęp do biblioteki MFC DLL w różnych wątkach?

Aplikacje wielowątkowa mogą uzyskiwać dostęp do zwykłych bibliotek DLL MFC, które dynamicznie łączą się z bibliotekami DLL rozszerzeń MFC i MFC z różnych wątków. Aplikacja może uzyskiwać dostęp do zwykłych bibliotek DLL MFC, które statycznie łączą się z MFC z wielu wątków utworzonych w aplikacji.

Czy istnieją klasy lub funkcje MFC, których nie można używać w dll MFC?

Biblioteki DLL rozszerzeń używają CWinAppklasy pochodnej aplikacji klienckiej. Nie mogą mieć własnej CWinAppklasy pochodnej.

Zwykłe biblioteki DLL MFC muszą mieć klasę pochodną CWinAppi pojedynczy obiekt tej klasy aplikacji, podobnie jak aplikacja MFC. CWinApp W przeciwieństwie do obiektu aplikacji CWinApp obiekt biblioteki DLL nie ma głównej pompy komunikatów.

Należy pamiętać, że ponieważ CWinApp::Run mechanizm nie ma zastosowania do biblioteki DLL, aplikacja jest właścicielem głównej pompy komunikatów. Jeśli biblioteka DLL otwiera moderowane okna dialogowe lub ma własne główne okno ramowe, główna pompa komunikatów aplikacji musi wywołać procedurę wyeksportowaną przez bibliotekę DLL, która z kolei wywołuje CWinApp::PreTranslateMessage funkcję składową obiektu aplikacji biblioteki DLL.

Jakich technik optymalizacji należy użyć, aby zwiększyć wydajność aplikacji klienckiej podczas ładowania?

Jeśli biblioteka DLL jest regularną biblioteką MFC DLL, która jest statycznie połączona z MFC, zmiana jej na zwykłą bibliotekę MFC DLL, która jest dynamicznie połączona z MFC, zmniejsza rozmiar pliku.

Jeśli biblioteka DLL ma dużą liczbę wyeksportowanych funkcji, należy użyć pliku def, aby wyeksportować funkcje (zamiast używać __declspec(dllexport)) i użyć atrybutu NONAME pliku def dla każdej wyeksportowanej funkcji. Atrybut NONAME powoduje tylko wartość porządkową, a nie nazwę funkcji przechowywaną w tabeli eksportu biblioteki DLL, co zmniejsza rozmiar pliku.

Biblioteki DLL, które są niejawnie połączone z aplikacją, są ładowane podczas ładowania aplikacji. Aby zwiększyć wydajność ładowania, spróbuj podzielić bibliotekę DLL na różne biblioteki DLL. Umieść wszystkie funkcje wymagane przez aplikację wywołującą natychmiast po załadowaniu do jednej biblioteki DLL i niejawnie połącz tę bibliotekę DLL z aplikacją wywołującą. Umieść inne funkcje, których aplikacja wywołująca nie potrzebuje od razu do innej biblioteki DLL i mają jawne łącze aplikacji do tej biblioteki DLL. Aby uzyskać więcej informacji, zobacz Łączenie pliku wykonywalnego z biblioteką DLL.

Istnieje przeciek pamięci w mojej regularnej biblioteki MFC DLL, ale mój kod wygląda dobrze. Jak mogę znaleźć przeciek pamięci?

Jedną z możliwych przyczyn przecieku pamięci jest to, że MFC tworzy obiekty tymczasowe, które są używane wewnątrz funkcji obsługi komunikatów. W aplikacjach MFC te obiekty tymczasowe są automatycznie czyszczone w CWinApp::OnIdle() funkcji wywoływanej między przetwarzaniem komunikatów. Jednak w bibliotekach linków dynamicznych MFC (DLL) OnIdle() funkcja nie jest wywoływana automatycznie. W związku z tym obiekty tymczasowe nie są automatycznie czyszczone. Aby wyczyścić obiekty tymczasowe, biblioteka DLL musi być okresowo wywoływana OnIdle(1) .