TN011: Za pomocą MFC jako część biblioteki DLL
Uwaga ta opisuje regularnych biblioteki DLL, które umożliwiają używanie biblioteki MFC jako część systemu Windows biblioteki dołączanej (dynamicznie DLL).Zakłada się, że znasz z bibliotek DLL systemu Windows i sposobu ich tworzenia.Uzyskać rozszerzenie MFC DLL, z którym można utworzyć rozszerzenia do biblioteki MFC zobacz DLL wersji MFC.
Biblioteka DLL interfejsów
Regularne dll zakładać, interfejsy między aplikacją i biblioteki DLL są określone w c podobne funkcje lub klasy jawnie wywożonych.Nie można wyeksportować interfejsy klas MFC.
Jeśli zarówno biblioteki DLL, jak i aplikacji chcesz używać klasy MFC, mają wybór, albo użyć udostępnioną wersję biblioteki MFC lub statycznie łącze do kopii bibliotek.Aplikacji oraz biblioteki DLL zarówno skorzystać z jednej z wersji standardowej biblioteki MFC.
Regularne biblioteki DLL mają kilka zalet:
Aplikacja korzystająca z biblioteki DLL nie trzeba używać klasy MFC i nie musi być aplikacji Visual C++.
Z regularnych dll, które statycznie połączyć MFC rozmiar pliku DLL zależy tylko procedur MFC i c runtime, które są używane i połączone.
Regularne biblioteki DLL, które dynamicznie połączyć MFC oszczędności w pamięci z udostępnionych wersji MFC może być znaczne.Jednak należy rozdzielić udostępnionego bibliotek DLL Mfc<version>.dll i Msvvcrt<version>dll z biblioteki DLL.
Projekt DLL jest niezależna od sposobu implementacji klasy.Projekt DLL eksportuje tylko dla interfejsów API ma.W związku z powyższym zmiana wykonania regularnych biblioteki DLL są nadal ważne.
Z regularnych biblioteki DLL, które statycznie połączyć MFC użycie zarówno DLL i aplikacji MFC, nie ma problemów z aplikacji, która chce różnych wersji biblioteki MFC DLL lub odwrotnie.Ponieważ biblioteki MFC jest łączony statycznie do każdej biblioteki DLL lub EXE, nie ma informacje o wersji, które mają.
Ograniczenia interfejsu API
Niektóre funkcje MFC nie dotyczy wersji biblioteki DLL, albo ze względu na ograniczenia techniczne lub ponieważ usługi te są zazwyczaj świadczone przez aplikację.W bieżącej wersji MFC jest jedyną funkcją, która nie jest stosowana CWinApp::SetDialogBkColor.
Tworzenie biblioteki DLL
Podczas kompilowania regularnych biblioteki DLL, które statycznie połączyć MFC, symbole _USRDLL i _WINDLL musi być zdefiniowana.Kod DLL musi być również skompilowana z następujących przełączników kompilatora:
/D_WINDLLoznacza, że kompilacji jest biblioteki DLL
/D_USRDLLOkreśla, że tworzysz regularnych DLL
Należy również zdefiniować te symbole i używać tych przełączników kompilator podczas kompilowania regularnych biblioteki DLL, które dynamicznie połączyć MFC.Ponadto symbol _AFXDLL musi być zdefiniowany i musi zostać skompilowany kod biblioteki DLL z:
- /D_AFXDLLOkreśla budowania regularnych biblioteki DLL, która dynamicznie łączy MFC
Interfejsy (API) między aplikacją i Biblioteka DLL musi jawnie wywozu.Zaleca się zdefiniowanie interfejsy, aby się niską przepustowością i używać interfejsów c tylko, jeśli to możliwe.Bezpośrednie c interfejsy są łatwiejsze w obsłudze niż bardziej złożonych klasy C++.
Umieścić swoje interfejsy API w oddzielnych nagłówek, który może zawierać zarówno c i C++.Zobacz nagłówek ScreenCap.h w próbce MFC zaawansowane pojęcia DLLScreenCap przykład.Aby wyeksportować swoje funkcje, należy wprowadzić je w EXPORTS sekcji w pliku definicji modułów (.DEF) lub zawierać __declspec(dllexport) w definicji funkcji.Użyj __declspec(dllimport) zaimportować te funkcje klienta pliku wykonywalnego.
Należy dodać AFX_MANAGE_STATE makro na początku eksportowanych funkcji w regularnych biblioteki DLL, które dynamicznie połączyć MFC.To makro ustawia bieżący stan modułu dla biblioteki DLL.Aby użyć tego makra, Dodaj następujący wiersz kodu na początku funkcji wyeksportowanych z biblioteki DLL:
AFX_MANAGE_STATE(AfxGetStaticModuleState( ))
WinMain - > Funkcja DllMain
Biblioteki MFC definiuje standardowy Win32 DllMain punkt wejścia, który inicjuje your CWinApp pochodzące z obiektu, jak w typowych aplikacji MFC.Umieścić wszystkie inicjalizacji specyficznej dla biblioteki DLL w InitInstance metoda jak typowa aplikacja MFC.
Należy zauważyć, że CWinApp::Run mechanizmu nie stosuje się do biblioteki DLL, ponieważ aplikacja jest właścicielem pompy główne wiadomości.Jeśli biblioteki DLL wyświetla niemodalny okna dialogowe lub okno główne ramki własnej, pompa wiadomości głównym aplikacji musi wywołać rutynowych wyeksportowane biblioteki DLL, który wywołuje CWinApp::PreTranslateMessage.
Zobacz DLLScreenCap próbkę do korzystania z tej funkcji.
DllMain MFC zapewnia będzie wywoływać funkcji CWinApp::ExitInstance metody klasy pochodzącej z CWinApp przed Biblioteka DLL jest zwalniana.
Łączenie biblioteki DLL
Z regularnych dll, które statycznie połączyć MFC należy połączyć bibliotekę DLL z Nafxcwd.lib lub Nafxcw.lib i z wersją c modułów wykonawczych, o nazwie Libcmt.lib.Biblioteki te są wstępnie i mogą być instalowane, określając je podczas uruchamiania Instalatora Visual C++.
Przykładowy kod
Zobacz przykładowy MFC zaawansowane koncepcje pakietu DLLScreenCap całą próbkę.Kilka interesujących rzeczy Uwaga w tym przykładzie są następujące:
Flagi kompilatora biblioteki DLL i tych aplikacji są różne.
Linie łączy i.Pliki DLL DEF oraz dla aplikacji są różne.
Aplikacja korzystająca z biblioteki DLL nie ma w C++.
Interfejs między aplikacją i Biblioteka DLL jest API, które są wykorzystywane przez c lub C++, jest wywożona z DLLScreenCap.def.
Poniższy przykład ilustruje interfejs API, który jest zdefiniowany w regularnych biblioteki DLL, które statycznie łączy się MFC.W tym przykładzie deklaracji jest ujęty w extern "C" { } bloku dla użytkowników języka C++.Ta ma kilka zalet.Po pierwsze ułatwia użytkownika DLL interfejsów API można używać przez aplikacje klienckie-C++.Po drugie zmniejsza obciążenie DLL ponieważ przekręcona nazwa języka C++, nie zostaną zastosowane do nazwy eksportowane.Wreszcie, ułatwi jawnie dodać do.DEF pliku (w przypadku wywozu przez wartość porządkową) bez konieczności przejmować przekręcona nazwa.
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
struct TracerData
{
BOOL bEnabled;
UINT flags;
};
BOOL PromptTraceFlags(TracerData FAR* lpData);
#ifdef __cplusplus
}
#endif
Struktury, używany przez interfejs API nie pochodzą z klas MFC i są zdefiniowane w nagłówku API.To zmniejsza złożoność interfejs między DLL i stosowania i sprawia, że biblioteka DLL można używać przez programy C.