TN011: Przy użyciu MFC jako część biblioteki DLL

Uwaga ta opisuje regularnych bibliotek DLL, które umożliwiają używanie biblioteki MFC jako część systemu Windows biblioteki dołączanej (dynamicznie DLL). Zakłada się, że znasz z biblioteki DLL systemu Windows i jak budować je. Aby uzyskać informacje dotyczące rozszerzenia MFC biblioteki dll, które pozwalają na tworzenie rozszerzeń do biblioteki MFC, zobacz DLL wersją MFC.

Biblioteka DLL interfejsów

Regularne biblioteki DLL zakładają, interfejsy między aplikacją i biblioteki DLL są określone w normalnej C-podobne funkcje lub jawnie wywożonych klas. Nie mogą być eksportowane interfejsu klasy MFC.

Jeśli biblioteka DLL i aplikacji chcesz używać MFC, zarówno mają możliwość korzystania z udostępnionych wersji biblioteki MFC albo kopii biblioteki MFC powiązana statycznie do nich. W wersjach wcześniejszych aż do programu Visual C++ 4.0 bibliotek statycznych łączy MFC były różne dla aplikacji i bibliotek DLL. Z bieżącą wersją MFC, aplikacji i biblioteki DLL zarówno skorzystać z jednej z wersji standardowej biblioteki MFC. Nie jest oddzielnym biblioteki dla biblioteki dll w tej wersji (MFC dzięki wyborem w czasie wykonywania).

Regularne biblioteki DLL mają kilka zalet:

Ograniczenia API

Niektóre funkcje usługi MFC nie mają zastosowania do wersji biblioteki DLL, albo z powodu ograniczeń technicznych lub ponieważ te usługi są zazwyczaj świadczone przez aplikację. Ograniczenia te są wymienione poniżej:

Tworzenie biblioteki DLL

Podczas kompilowania regularnych biblioteki dll, które statycznie połączyć MFC, symbole "_USRDLL" i "_WINDLL", musi być określona. Kod biblioteki DLL musi być również skompilowana z następujących przełączników kompilatora:

Podczas kompilowania regularnych biblioteki dll, które dynamicznie połączyć MFC, można zdefiniować powyżej symbole i używać powyższych przełączników kompilatora. Additonally, symbol "_AFXDLL" musi być zdefiniowany i kodzie DLL muszą zostać zgromadzone z:

Interfejsy (API) między aplikacją i biblioteki DLL musi być wyraźnie wywiezione. Zalecane jest, definiowania sieci interfejsy się niską przepustowością, pojawia się wtykający do c interfejsów, w przypadku gdy jest to możliwe. Bardziej bezpośrednie c interfejsy są łatwiejsze do utrzymania niż bardziej złożonych klas języka C++.

Umieść swój API w oddzielnych nagłówek, który może zawierać pliki c i C++ (w ten sposób nie ograniczają klientów DLL dla programistów języka C++). Zobacz nagłówka TRACEAPI.H w próbce MFC zaawansowane pojęcia DLLTRACE przykładem. Aby wyeksportować funkcje, umieszcza je w części wywozu plik definicji modułu (.DEF) lub zawierają __declspec(dllexport) w definicji funkcji. Użyj __declspec(dllimport) aby importować te funkcje do wykonywalnego klienta.

Należy dodać makro AFX_MANAGE_STATE na giełdę wszystkich eksportowanych funkcji w regularnych biblioteki dll, które dynamicznie połączyć MFC ustawić bieżący stan modułu dla biblioteki DLL. Robi się to poprzez dodanie następujący wiersz kodu do początku funkcji wywożonych z biblioteki DLL:

nbsp; & nbsp;

AFX_MANAGE_STATE (AfxGetStaticModuleState ())

nbsp; & nbsp;

&WinMain - BT; DllMain

Biblioteki MFC definiuje standardowy punktu wejścia Win32 DllMain , który inicjuje obiekt pochodnych CWinApp jak w normalnych zastosowaniach MFC. Umieścić wszystkie inicjalizacji specyficznej dla biblioteki DLL w funkcji członek InitInstance jak w normalnych zastosowaniach MFC.

Należy zauważyć, że mechanizm CWinApp::Run nie stosuje się do biblioteki DLL, ponieważ aplikacja jest właścicielem pompy głównej wiadomości. Jeśli biblioteka DLL wywołuje okno dialogowe niemodalny lub posiada okno główna ramka własnej, pompy głównej wiadomości aplikacji należy wywołać rutynowych eksportowany plik DLL, który wywołuje CWinApp::PreTranslateMessage.

Zobacz próbkę DLLTRACE do korzystania z tej funkcji.

Państwa ExitInstance funkcjonowanie sieci CWinApp pochodną klasy zostanie wywołana z MFC pod warunkiem funkcja DllMain przed biblioteki DLL jest zwolniony.

Co zrobić, aby połączyć je wszystkie razem

Z regularnego biblioteki dll, które statycznie połączyć MFC należy powiązać biblioteki DLL z tej biblioteki (NAFXCWD.Biblioteka lub NAFXCW.LIB) wraz z wersją c zostały o nazwie ' LIBCMT.LIB ". Biblioteki te są wstępnie i może być zainstalowany określając je podczas uruchamiania Instalatora programu Visual C++.

Przykładowy kod

Proszę zobacz MFC zaawansowane pojęcia przykładowy program DLLTRACE na całą próbkę. Obejmuje to prosty plik DLL, o nazwie "TRACER.Biblioteka DLL' ten implementuje flagi śledzenia AFX dialogowe (patrz technicznych Uwaga 7). Posiada również prostych aplikacji HELLO, która wywołuje DLL za pomocą okna dialogowego.

Kilka interesujących rzeczą:

Następujące wyciąg z TRACEAPI.H ilustruje, co jest niezbędne dla jeden interfejs API, który jest zdefiniowany w regularnych biblioteki DLL, które statycznie łączy się MFC:

#ifdef __cplusplus
extern "C" {}
#endifnbsp; / * __cplusplus * /

struct TracerData
{
    BOOL bWłączony;
    UI&NT flagi;
};

BOOL DALEKO PASCAL wywóz PromptTraceFlags (FAR TracerData * lpData);

#ifdef __cplusplus
}
#ENDIF

W tym przykładzie deklaracji jest ujęty w bloku "extern"C"{}" dla użytkowników języka C++. Ma kilka zalet. Po pierwsze ułatwia API biblioteki DLL używany przez aplikacje klienckie-C++. Po drugie zmniejsza to DLL narzutów ponieważ przekręcona nazwa języka C++, nie będą stosowane do nazwy eksportowane. Wreszcie, ułatwia on za łatwiej wyraźnie dodać.DEF pliku (w przypadku wywozu przez porządkowe) bez konieczności przejmować przekręcona nazwa.

Wszystkie funkcje interfejsu API są, "FAR PASCAL wywozu". Chociaż nie stricly niezbędne do biblioteki DLL systemu Win32, definicje te były trzymane na łatwe przenoszenie wstecz do 16-bitowego systemu Windows. Makra FAR, PASCALi EKSPORTOWANIE wszystkich Rozwiń, aby nic w systemach Win32.

Struktury używany przez funkcję API nie pochodzą z klas MFC i całkowicie zdefiniowane są w nagłówku API. To zmniejsza złożoność interfejs między biblioteki DLL i stosowania i po raz kolejny, czyni biblioteki DLL stosowanych przez c programy, jak również.

Wszystkie wskaźniki dane używane w interfejsie API są wyraźne FAR wskaźniki. Ponownie, FAR, nie jest to naprawdę konieczne dla Win32, ale jest użyteczne, jeśli planuje się skompilować kod dla 16-bitowego systemu Windows w przyszłości.

Uwagi techniczne przez liczbę |nbsp; Uwagi techniczne według kategorii

Index