Dela via


Vanliga MFC-DLL:er dynamiskt länkade till MFC

En vanlig MFC DLL som är dynamiskt länkad till MFC är en DLL som använder MFC internt, och de exporterade funktionerna i DLL kan anropas av antingen MFC eller icke-MFC-körbara filer. Som namnet beskriver skapas den här typen av DLL med hjälp av biblioteksversionen av MFC med dynamisk länk (även kallad den delade versionen av MFC). Funktioner exporteras vanligtvis från en vanlig MFC DLL med hjälp av standard-C-gränssnittet.

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 för att ange det aktuella modultillståndet till det för DLL-filen. Detta görs genom att lägga till följande kodrad i början av funktioner som exporteras från DLL:en:

AFX_MANAGE_STATE(AfxGetStaticModuleState( ))

En vanlig MFC DLL, dynamiskt länkad till MFC, har följande funktioner:

  • Det här är en ny typ av DLL som introduceras av Visual C++ 4.0.

  • Den körbara klienten kan skrivas på valfritt språk som stöder användning av DLL:er (C, C++, Pascal, Visual Basic och så vidare); det behöver inte vara ett MFC-program.

  • Till skillnad från den statiskt länkade vanliga MFC DLL är den här typen av DLL dynamiskt länkad till MFC DLL (även kallat delad MFC DLL).

  • MFC-importbiblioteket som är länkat till den här typen av DLL är samma som används för DLL:er för MFC-tillägg eller program med MFC DLL: MFCxx(D).lib.

En vanlig MFC DLL, dynamiskt länkad till MFC har följande krav:

  • Dessa DLL:er kompileras med _AFXDLL definierade, precis som en körbar fil som är dynamiskt länkad till MFC DLL. Men _USRDLL definieras också, precis som en vanlig MFC DLL som är statiskt kopplad till MFC.

  • Den här typen av DLL måste instansiera en CWinApp-härledd klass.

  • Den här typen av DLL använder den DllMain som tillhandahålls av MFC. Placera all DLL-specifik initieringskod i InitInstance medlemsfunktionen och avslutningskoden i ExitInstance som i en vanlig MFC-applikation.

Eftersom den här typen av DLL använder den dynamiska länkbiblioteksversionen av MFC måste du uttryckligen ange det aktuella modultillståndet till det för DLL:en. Det gör du genom att använda makrot AFX_MANAGE_STATE i början av varje funktion som exporteras från DLL:en.

vanliga MFC-DLL:er måste ha en CWinApp-härledd klass och ett enda objekt i den programklassen, liksom ett MFC-program. Objektet för CWinApp DLL:en har dock ingen huvudmeddelandepump, liksom objektet för CWinApp ett 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 huvudfönster måste din applikations huvudmeddelandepump anropa en DLL-exporterad rutin som anropar CWinApp::PreTranslateMessage.

Placera all specifik DLL-initiering i klassens CWinApp::InitInstance medlemsfunktion som i ett vanligt MFC-program. Medlemsfunktionen CWinApp::ExitInstance i din CWinApp härledda klass anropas från den MFC-tillhandahållna DllMain funktionen innan DLL:en tas bort.

Du måste distribuera delade DLL:er MFCx0.dll och Msvcr*0.dll (eller liknande filer) med ditt program.

En DLL som är dynamiskt länkad till MFC kan inte heller statiskt länka till MFC. Program länkar till vanliga MFC-DLL:er dynamiskt länkade till MFC, precis som andra DLL-filer.

Symboler exporteras vanligtvis från en vanlig MFC DLL med hjälp av standard-C-gränssnittet. Deklarationen av en funktion som exporteras från en vanlig MFC DLL ser ut ungefär så här:

extern "C" __declspec(dllexport) MyExportedFunction( );

Alla minnesallokeringar inom en vanlig MFC-DLL bör ligga inom DLL-filen. DLL-filen bör inte skickas till eller ta emot från den körbara anroparen något av följande:

  • pekare till MFC-objekt

  • pekare till minne allokerat av MFC

Om du behöver göra något av ovanstående, eller om du behöver skicka MFC-härledda objekt mellan den körbara anroparen och DLL:en, måste du skapa en MFC-tilläggs-DLL.

Det är säkert att skicka pekare till minne som allokerats av C-körningsbiblioteken mellan ett program och en DLL endast om du gör en kopia av data. Du får inte ta bort eller ändra storlek på dessa pekare eller använda dem utan att göra en kopia av minnet.

När du skapar en vanlig MFC DLL som dynamiskt länkar till MFC måste du använda makrot AFX_MANAGE_STATE för att växla MFC-modultillståndet korrekt. Detta görs genom att lägga till följande kodrad i början av funktioner som exporteras från DLL:en:

AFX_MANAGE_STATE(AfxGetStaticModuleState( ))

Det AFX_MANAGE_STATE makrot ska inte användas i vanliga MFC-DLL:er som statiskt länkar till MFC eller I DLL:er för MFC-tillägg. Mer information finns i Hantera tillståndsdata för MFC-moduler.

Ett exempel på hur du skriver, skapar och använder en vanlig MFC-DLL finns i exempel-DLLScreenCap. Mer information om vanliga MFC-DLL:er som dynamiskt länkar till MFC finns i avsnittet "Konvertera DLLScreenCap till Dynamiskt länka med MFC DLL" i sammanfattningen för exemplet.

Vad vill du göra?

Vad vill du veta mer om?

Se även

Typer av DLL:er