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
CWinApp
instanci -odvozené třídy.Tento typ knihovny DLL používá knihovnu
DllMain
MFC. Umístěte veškerý inicializační kód specifický pro knihovnuInitInstance
DLL do členské funkce a ukončovací kódExitInstance
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 CWinApp
tří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?
Stavy modulu běžné knihovny MFC DLL dynamicky propojené s knihovnou MFC
Používání databázových, OLE a soketových rozšiřujících knihoven MFC DLL v běžných knihovnách MFC DLL