Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Den här anmärkningen beskriver vanliga MFC-DLL:er, som gör att du kan använda MFC-biblioteket som en del av ett DLL-bibliotek (Windows Dynamic Link Library). Det förutsätter att du är bekant med Windows DLL:er och hur du skapar dem. Information om DLL:er för MFC-tillägg, med vilka du kan skapa tillägg till MFC-biblioteket, finns i DLL-versionen av MFC.
DLL-gränssnitt
vanliga MFC-DLL:er förutsätter att gränssnitt mellan programmet och DLL anges i C-liknande funktioner eller uttryckligen exporterade klasser. Det går inte att exportera MFC-klassgränssnitt.
Om både en DLL och ett program vill använda MFC kan båda välja att antingen använda den delade versionen av MFC-biblioteken eller att statiskt länka till en kopia av biblioteken. Programmet och DLL kan båda använda en av standardversionerna av MFC-biblioteket.
vanliga MFC-DLL:er har flera fördelar:
Programmet som använder DLL:t behöver inte använda MFC och behöver inte vara ett Visual C++-program.
Med vanliga MFC-DLL:er som statiskt länkar till MFC beror DLL-storleken endast på de MFC- och C-körningsrutiner som används och länkas.
Med vanliga MFC-DLL:er som dynamiskt länkar till MFC kan besparingarna i minnet från att använda den delade versionen av MFC vara betydande. Du måste dock distribuera delade DLL:er, Mfc-version<>.dll och Msvvcrt-version<>.dllmed din DLL.
DLL-designen är oberoende av hur klasser implementeras. DLL-designen exporterar endast till de API:er som du vill använda. Om implementeringen ändras är därför vanliga MFC-DLL:er fortfarande giltiga.
Med vanliga MFC-DLL:er som statiskt länkar till MFC, om både DLL och program använder MFC, finns det inga problem med programmet som vill ha en annan version av MFC än DLL eller vice versa. Eftersom MFC-biblioteket är statiskt länkat till varje DLL eller EXE är det ingen tvekan om vilken version du har.
API-begränsningar
Vissa MFC-funktioner gäller inte för DLL-versionen, antingen på grund av tekniska begränsningar eller på grund av att dessa tjänster vanligtvis tillhandahålls av programmet. Med den aktuella versionen av MFC är CWinApp::SetDialogBkColorden enda funktion som inte är tillämplig .
Skapa din DLL
När du kompilerar vanliga MFC-DLL:er som statiskt länkar till MFC måste symbolerna _USRDLL och _WINDLL definieras. DLL-koden måste också kompileras med följande kompilatorväxlar:
/D_WINDLL betyder att kompilering är för en DLL
/D_USRDLL anger att du skapar en vanlig MFC DLL
Du måste också definiera dessa symboler och använda dessa kompilatorväxlar när du kompilerar vanliga MFC-DLL:er som dynamiskt länkar till MFC. Dessutom måste symbolen _AFXDLL definieras och DLL-koden måste kompileras med:
- /D_AFXDLL anger att du skapar en vanlig MFC DLL som dynamiskt länkar till MFC
Gränssnitten (API:er) mellan programmet och DLL måste uttryckligen exporteras. Vi rekommenderar att du definierar att dina gränssnitt har låg bandbredd och endast använder C-gränssnitt om du kan. Direct C-gränssnitt är enklare att underhålla än mer komplexa C++-klasser.
Placera dina API:er i en separat rubrik som kan inkluderas av både C- och C++-filer. Se sidhuvudet ScreenCap.h i exemplet DLLScreenCap för MFC Advanced Concepts för ett exempel. Om du vill exportera dina funktioner anger du dem i avsnittet i EXPORTS moduldefinitionsfilen (. DEF) eller inkludera __declspec(dllexport) i funktionsdefinitionerna. Använd __declspec(dllimport) för att importera dessa funktioner till den körbara klienten.
Du måste lägga till AFX_MANAGE_STATE makrot i början av alla exporterade funktioner i vanliga MFC-DLL:er som dynamiskt länkar till MFC. Det här makrot anger det aktuella modultillståndet till det för DLL-filen. Om du vill använda det här makrot lägger du till följande kodrad i början av funktioner som exporteras från DLL:en:
AFX_MANAGE_STATE(AfxGetStaticModuleState( ))
WinMain –> DllMain
MFC-biblioteket definierar den standardinmatningspunkt för Win32 DllMain som initierar ditt CWinApp-härledda objekt som i ett typiskt MFC-program. Placera all DLL-specifik initiering i InitInstance-metoden som i ett typiskt MFC-program.
Observera att mekanismen CWinApp::Run inte gäller för en DLL eftersom programmet äger huvudmeddelandepumpen. Om din DLL visar lägeslösa dialogrutor eller har ett eget huvudramfönster måste din applikations huvudmeddelandepump anropa en DLL-exporterad rutin som anropar CWinApp::PreTranslateMessage.
Se DLLScreenCap-exemplet för användning av den här funktionen.
Funktionen DllMain som MFC tillhandahåller anropar metoden CWinApp::ExitInstance för din klass som härleds från CWinApp innan DLL:en tas bort.
Länka din DLL-fil
Med vanliga MFC-DLL:er som statiskt länkar till MFC måste du länka din DLL med Nafxcwd.lib eller Nafxcw.lib och med versionen av C-runtimes med namnet Libcmt.lib. De här biblioteken är fördefinierade och kan installeras genom att ange dem när du kör Visual C++-konfigurationen.
Exempelkod
Se exempelprogrammet DLLScreenCap för MFC Advanced Concepts för ett fullständigt exempel. Flera intressanta saker att notera i det här exemplet är följande:
Kompilatorflaggorna för DLL och programmets flaggor skiljer sig åt.
Länkraderna och .DEF-filerna för DLL och de för applikationen är olika.
Programmet som använder DLL:en behöver inte finnas i C++.
Gränssnittet mellan programmet och DLL är ett API som kan användas av C eller C++ och exporteras med DLLScreenCap.def.
I följande exempel visas ett API som definieras i en vanlig MFC DLL som statiskt länkar till MFC. I det här exemplet omges deklarationen av ett extern "C" { } block för C++-användare. Detta har flera fördelar. Först gör det dina DLL-API:er användbara för icke-C++-klientprogram. För det andra minskar DLL-belastningen eftersom C++-namnmangling inte tillämpas på det exporterade namnet. Slutligen blir det enklare att uttryckligen lägga till i en .DEF-fil (för export med ordningstal) utan att behöva oroa sig för namnmangling.
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
struct TracerData
{
BOOL bEnabled;
UINT flags;
};
BOOL PromptTraceFlags(TracerData FAR* lpData);
#ifdef __cplusplus
}
#endif
De strukturer som används av API:et härleds inte från MFC-klasser och definieras i API-huvudet. Detta minskar komplexiteten i gränssnittet mellan DLL och programmet och gör DLL-filen användbar av C-program.
Se även
tekniska anteckningar efter nummer
tekniska anteckningar efter kategori