Sdílet prostřednictvím


Běžné knihovny MFC DLL staticky propojené do MFC

Běžná knihovna MFC DLL dynamicky propojená s knihovnou MFC je knihovna DLL, která interně používá knihovnu MFC a exportované funkce v knihovně DLL mohou být volány buď spustitelnými soubory MFC, nebo jinými spustitelnými soubory než MFC. Jak název popisuje, tento druh knihovny DLL je sestaven pomocí verze knihovny MFC s dynamickým propojením (označuje se také jako sdílená verze knihovny MFC). Funkce se obvykle exportují z běžné knihovny MFC DLL pomocí standardního rozhraní jazyka C.

Makro je nutné přidat AFX_MANAGE_STATE na začátek všech exportovaných funkcí v běžných knihovnách MFC DLL, které dynamicky propojují s mfc, aby se aktuální stav modulu nastavil na ten pro knihovnu DLL. To se provádí přidáním následujícího řádku kódu na začátek funkcí exportovaných z knihovny DLL:

AFX_MANAGE_STATE(AfxGetStaticModuleState( ))

Běžná knihovna MFC DLL, dynamicky propojená s knihovnou MFC, má následující funkce:

  • Jedná se o nový typ knihovny DLL zavedený jazykem Visual C++ 4.0.

  • Spustitelný soubor klienta lze napsat v libovolném jazyce, který podporuje použití knihoven DLL (C, C++, Pascal, Visual Basic atd.); nemusí to být aplikace MFC.

  • Na rozdíl od staticky propojené běžné knihovny MFC DLL je tento typ knihovny DLL dynamicky propojený s knihovnou MFC DLL (označovanou také jako sdílená knihovna MFC DLL).

  • Knihovna MFC importu propojená s tímto typem knihovny DLL je stejná jako pro knihovny DLL rozšíření MFC nebo aplikace využívající knihovnu MFC DLL: MFCxx(D).lib.

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

  • Tyto knihovny DLL se kompilují s _AFXDLL definovanými stejně jako spustitelný soubor, který je dynamicky propojený s knihovnou MFC DLL. Ale _USRDLL je také definován, stejně jako běžná knihovna MFC DLL, která je staticky propojena s mfc.

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

  • Tento typ knihovny DLL používá knihovnu DllMain MFC. Umístěte veškerý inicializační kód specifický pro knihovnu InitInstance DLL do členské funkce a ukončovací kód ExitInstance jako v normální aplikaci MFC.

Vzhledem k tomu, že tento druh knihovny DLL používá verzi knihovny MFC dynamického propojení, je nutné explicitně nastavit aktuální stav modulu na ten pro knihovnu DLL. K tomu použijte makro AFX_MANAGE_STATE na začátku každé funkce exportované z knihovny DLL.

běžné knihovny MFC DLL musí mít -odvozenou CWinApptřídu a jeden objekt této třídy aplikace, stejně jako aplikace MFC. CWinApp Objekt knihovny DLL však nemá hlavní čerpadlo zpráv, stejně jako CWinApp objekt aplikace.

Všimněte si, že CWinApp::Run mechanismus se nevztahuje na knihovnu DLL, protože aplikace vlastní hlavní čerpadlo zpráv. Pokud knihovna DLL zobrazí bezmodální dialogy nebo má vlastní okno hlavního rámce, hlavní zpráva pumpa vaší aplikace musí volat dll exportovanou rutinu, která volá CWinApp::PreTranslateMessage.

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

Sdílené knihovny DLL musíte distribuovat MFCx0.dll a msvcr*0.dll (nebo podobné soubory) s vaší aplikací.

Knihovna DLL, která je dynamicky propojená s knihovnou MFC, nemůže také staticky propojit s knihovnou MFC. Aplikace propojují běžné knihovny MFC DLL dynamicky propojené s knihovnou MFC stejně jako všechny ostatní knihovny DLL.

Symboly se obvykle exportují z běžné knihovny MFC DLL pomocí standardního rozhraní jazyka C. Deklarace funkce exportované z běžné knihovny MFC DLL vypadá nějak takto:

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

Všechny přidělení paměti v rámci běžné knihovny MFC DLL by měly zůstat v knihovně DLL; knihovna DLL by neměla předávat ani přijímat z volajícího spustitelného souboru žádnou z následujících možností:

  • ukazatele na objekty MFC

  • ukazatele na paměť přidělenou knihovnou MFC

Pokud potřebujete provést některou z výše uvedených možností nebo pokud potřebujete předat odvozené objekty MFC mezi volajícím spustitelným souborem a knihovnou DLL, je nutné sestavit rozšiřující knihovnu DLL knihovny MFC.

Je bezpečné předat ukazatele na paměť, které byly přiděleny knihovnami běhu jazyka C mezi aplikací a knihovnou DLL pouze v případě, že vytvoříte kopii dat. Nesmíte odstranit ani změnit velikost těchto ukazatelů nebo je použít bez vytvoření kopie paměti.

Při vytváření běžné knihovny MFC DLL, která dynamicky odkazuje na MFC, je nutné použít makro AFX_MANAGE_STATE ke správnému přepnutí stavu modulu MFC. To se provádí přidáním následujícího řádku kódu na začátek funkcí exportovaných z knihovny DLL:

AFX_MANAGE_STATE(AfxGetStaticModuleState( ))

Makro AFX_MANAGE_STATE by se nemělo používat v běžných knihovnách MFC DLL, které staticky odkazují na knihovny MFC nebo v rozšiřujících knihovnách DLL knihovny MFC. Další informace naleznete v tématu Správa stavových dat modulů MFC.

Příklad zápisu, sestavení a použití běžné knihovny MFC DLL naleznete v ukázkové knihovně DLLScreenCap. Další informace o běžných knihovnách MFC DLL, které dynamicky propojují s knihovnou MFC, naleznete v části s názvem "Převod dllScreenCap na dynamicky propojit s knihovnou MFC DLL" v abstrakci ukázky.

Co chcete udělat?

O čem chcete vědět víc?

Viz také

Typy knihoven DLL