Sdílet prostřednictvím


Běžné knihovny DLL dynamicky propojené ke knihovně MFC

Běžná knihovna DLL dynamicky propojená ke knihovně MFC je DLL knihovnou, která používá interně knihovnu MFC a exportované funkce v knihovně DLL mohou být volány spustitelnými soubory knihovny MFC nebo knihovny non-MFC. Jak název popisuje, je tento druh DLL knihovny sestaven pomocí dynamické knihovny verze knihovny MFC (tzv. sdílenou verzí knihovny MFC). Funkce jsou obvykle exportovány z běžné DLL knihovny pomocí standartního rozhraní jazyka C.

Musíte přidat makro AFX_MANAGE_STATE na začátku všech exportovaných funkcí v běžných DLL knihovnách, které jsou dynamicky propojené ke knihovně MFC k nastavení aktuálního stavu modulu na jeden z knihovny DLL. To je provedeno přidáním následující řádky kódu na začátek exportované funkce z knihovny DLL:

AFX_MANAGE_STATE(AfxGetStaticModuleState( ))

Obvyklá DLL knihovna, dynamicky propojená ke knihovně MFC má k dispozici následující funkce:

  • Toto je nový typ DLL knihovny, zavedené aplikací Visual C++ 4.0.

  • Spustitelný soubor klienta může být napsán v libovolném jazyce, který podporuje používání DLL knihoven (C, C++, Pascal, Visual Basic a tak dále); nemusí to být aplikace knihovny MFC.

  • Na rozdíl od staticky propojené běžné DLL knihovny, je tento typ DLL knihovny dynamicky propojen ke knihovně MFC DLL (označované také jako sdílená knihovna MFC DLL).

  • Vložená knihovna MFC, propojená k tomuto typu DLL knihovny, je stejná jako ta, která je použita pro rozšiřující knihovny DLL nebo aplikace, používající knihovnu MFC DLL: MFCxx(D).lib.

Běžná DLL knihovna, dynamicky propojená ke knihovně MFC má následující požadavky:

  • Tyto DLL knihovny jsou s definovaným _AFXDLL, stejně jako spustitelný soubor, který je dynamicky propojen ke knihovně MFC DLL. Ale _USRDLL je také definováno, stejně jako běžná DLL knihovna, která je staticky propojena ke knihovně MFC DLL.

  • Tento typ DLL knihovny musí vytvořit instanci CWinApp-odvozené třídy.

  • Tento typ DLL knihovny používá DllMain, poskytnuté knihovnou MFC. Umístěte všechny inicializační kódy specifické DLL knihovny ve členské funkci InitInstance a kód ukončení v ExitInstance jako v normální aplikaci knihovny MFC.

Vzhledem k tomu, že tento druh DLL knihovny používá dynamickou knihovnu verze knihovny MFC, musíte nastavit aktuální stav modulu na jeden z knihovny DLL. Chcete-li to provést, použijte makro AFX_MANAGE_STATE na začátku každé exportované funkce z knihovny DLL.

Běžné knihovny DLL musí mít CWinApp-odvozenou třídu a jeden objekt této třídy aplikace, stejně jako aplikace knihovny MFC. Avšak objekt CWinApp DLL knihovny nemá hlavní "message pump", tak jako objekt CWinApp z aplikace.

Všimněte si, protože mechanismus CWinApp::Run se nevztahuje na knihovnu DLL, aplikace vlastní hlavní "message pump". Pokud vaše knihovna DLL vyvolá nemodální dialogová okna nebo má své vlastní okno, musí hlavní "message pump" Vaší aplikace zavolat rutinu exportované DLL knihovny, která volá CWinApp::PreTranslateMessage.

Umístěte všechny inicializace specifické DLL knihovny v členské funkci CWinApp::InitInstance tak jako v normální aplikaci knihovny MFC. Členská funkce CWinApp::ExitInstance Vaší odvozené třídy CWinApp je volána z poskytnuté funkce DllMain z knihovny MFC před uvolněním DLL knihovny.

S aplikací je nutné distribuovat sdílené DLL knihovny MFCx0.dll a Msvcr*0.dll (nebo podobné soubory).

Knihovna DLL, která je dynamicky propojena ke knihovně MFC, nemůže být staticky propojena ke knihovně MFC. Aplikace, propojené k běžným DLL knihovnám, které jsou dynamicky propojené ke knihovně MFC, jsou stejné jako jiné DLL knihovny.

Symboly jsou obvykle exportovány z běžné DLL knihovny pomocí standartního rozhraní jazyka C. Deklarace funkce exportované z běžné DLL knihovny vypadá takto:

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

Celé přidělená paměť v rámci běžné DLL knihovny může zůstat v rámci knihovny DLL; Knihovna DLL by neměla předat nebo obdržet volání spustitelnímu souboru jakkoliv z následujících:

  • ukazatelé na objekty knihovny MFC

  • ukazatelé na přidělenou paměť knihovnou MFC

Pokud je třeba provést některý z výše uvedených kroků nebo potřebujete-li předat objekt odvozené knihovny MFC mezi voláním spustitelného souboru a knihovnou DLL, pak musíte sestavit rozšiřující DLL knihovnu.

Je bezpečné předat ukazatelé na paměť, která byla přidělena běhovými knihovnami jazyka C mezi aplikací a DLL knihovnou pouze pokud provádíte kopii dat. Nesmíte odstranit nebo změnit velikost těchto ukazatelů nebo je použít bez vytváření kopie paměti.

Při vytváření běžné DLL knihovny, která je dynamicky propojena ke knihovně MFC, musíte použít makro AFX_MANAGE_STATE ke správnému přepnutí stavu modulu knihovny MFC. To je provedeno přidáním následující řádky kódu na začátek exportované funkce z knihovny DLL:

AFX_MANAGE_STATE(AfxGetStaticModuleState( ))

Makro AFX_MANAGE_STATE není vhodné používat, v běžných DLL knihovnách, které jsou staticky propojeny ke knihovně MFC nebo k rozšiřujícím knihovnám DLL. Další informace naleznete v tématu Správa stavu dat modulů knihovny MFC.

Příklad jak napsat, sestavit a použít běžnou DLL knihovnu, naleznete v příkladu DLLScreenCap. Další informace o běžných DLL knihovnách, které jsou dynamicky propojené ke knihovně MFC, naleznete v oddíle s názvem "Převod DLLScreenCap na dynamicky propojenou s knihovnou MFC DLL" v přehledu příkladu.

Co chcete udělat?

Co chcete vědět více?

Viz také

Koncepty

Typy knihoven DLL