Běžné knihovny DLL staticky propojené s knihovnou MFC
Běžná knihovna DLL staticky 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, tento druh knihovny DLL je sestaven pomocí staticky propojené verze knihovny MFC. Funkce jsou obvykle exportovány z běžné DLL knihovny pomocí standartního rozhraní jazyka C. Příklad jak napsat, sestavit a použít běžnou DLL knihovnu, naleznete v příkladu DLLScreenCap.
Všimněte si, že pojem USRDLL se již nepoužívá v dokumentaci k jazyku Visual C++. Obvyklá DLL knihovna, která je staticky propojena s knihovnou MFC má stejné vlastnosti jako dřívější USRDLL.
Běžná knihovna DLL, staticky propojená ke knihovně MFC má k dispozici následující funkce:
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.
Knihovna DLL se může propojit ke stejnému statickému propojení knihoven MFC, které používají aplikace. Neexistuje již samostatná verze statického propojení knihoven pro knihovny DLL.
Před verzí 4.0 knihovny MFC, USRDLL poskytovaly stejný typ funkcionality jako běžné knihovny DLL staticky propojeny s knihovnou MFC. Od verze 4.0 Visual C++ je pojem USRDLL zastaralý.
Běžná knihovna DLL, staticky propojená ke knihovně MFC má následující požadavky:
Tento typ knihovny DLL musí vytvořit instanci třídy odvozené z CWinApp.
Tento typ knihovny DLL používá DllMain, poskytnuté knihovnou MFC. Umístěte všechny inicializační kódy specifické knihovny DLL ve členské funkci InitInstance a kód ukončení v ExitInstance jako v normální aplikaci knihovny MFC.
I v případě, že je pojem USRDLL zastaralý, musíte stále definovat "_USRDLL" na příkazovém řádku kompilátoru. Tato definice určuje, které deklarace jsou získány ze souborů hlaviček knihovny MFC.
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í pumpu zpráv. Pokud knihovna DLL otevře nemodální dialogová okna nebo má své vlastní okno rámce, hlavní pumpa zpráv aplikace musí volat rutinu, která je exportovaná knihovnou DLL, a která volá členskou funkci CWinApp::PreTranslateMessage aplikačního objektu knihovny DLL.
Pro příklad této funkce se podívejte na ukázku DLLScreenCap.
Symboly jsou obvykle exportovány z běžné knihovny DLL pomocí standartního rozhraní jazyka C. Deklarace funkce exportované z běžné knihovny DLL by mohla vypadat takto:
extern "C" __declspec(dllexport) MyExportedFunction( );
Celá přidělená paměť v rámci běžné knihovny DLL 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í knihovnu DLL.
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.
Knihovna DLL, která je staticky propojena ke knihovně MFC, nemůže být dynamicky propojena ke sdíleným knihovnám MFC. Knihovna DLL, která je staticky propojena ke knihovně MFC je dynamicky vázána na aplikace stejně jako ostatní knihovny DLL; aplikace, které jsou propojené na ni, jsou stejné jako jiné knihovny DLL.
Standardní statická propojení knihoven MFC jsou pojmenována podle úmluvy popsané v Zásady vytváření názvů pro knihovny MFC DLL. S knihovnou MFC verze 3.0 a novější není však již nezbytné ručně sdělit propojovacímu programu verzi knihovny MFC, kterou chcete propojit. Místo toho soubory hlaviček knihovny MFC automaticky zjistí správnou verzi knihovny MFC pro propojení na základě preprocesoru, který definuje například _DEBUG nebo _UNICODE. Soubory hlaviček knihovny MFC přidají směrnice /DEFAULTLIB, které informují propojovací program, aby propojil konkrétní verzi knihovny MFC.