Sdílet prostřednictvím


TN011: Použití jako součást knihovny DLL MFC

Tato poznámka popisuje běžné knihovny DLL, které umožňují použití knihovny MFC jako součást systému Windows dynamická knihovna (DLL).Předpokládá obeznámeni s knihoven DLL systému Windows a způsob jejich vytvoření.Informace o rozšíření MFC knihovny DLL, s níž můžete vytvořit rozšíření knihovny MFC naleznete DLL verze MFC.

Knihovna DLL rozhraní

Knihovny DLL pravidelně předpokládá rozhraní mezi aplikací a knihovny DLL jsou specifikovány v funkce podobné c nebo explicitně exportovaný třídy.Rozhraní třídy MFC nelze exportovat.

Pokud knihovna DLL a aplikace pomocí MFC, mají volby použít sdílenou verzi knihovny MFC nebo staticky propojení kopie knihovny.Aplikace a knihovny DLL může používají jednu standardní verze knihovny MFC.

Pravidelné knihovny DLL mají několik výhod:

  • Aplikace, která používá knihovnu DLL nemá používat MFC a nemá být aplikace Visual C++.

  • S pravidelnou knihovny DLL, které staticky odkazují na MFC velikost souboru DLL závisí pouze na rutiny runtime MFC a C, které jsou používány a propojeny.

  • Pravidelné knihovny DLL, které dynamické propojení MFC úspor v paměti z pomocí sdílenou verzi MFC lze významné.Musí však distribuovat sdílené knihovny DLL Mfc<version>dll a Msvvcrt<version>dll s knihovny DLL.

  • DLL je nezávislý způsob implementace třídy.Návrh knihovny DLL exportuje pouze chcete rozhraní API.Pravidelné knihovny DLL jsou stále platné výsledkem změně provádění.

  • S pravidelnou knihovny DLL, které staticky odkazují na MFC Pokud knihovna DLL a aplikace MFC, neexistují žádné problémy s aplikací, která vyžaduje jinou verzi než knihovnu DLL nebo naopak MFC.Protože knihovny MFC staticky propojeny do každé knihovny DLL nebo EXE, není žádná otázka, o kterou verzi máte.

Omezení rozhraní API

Některé funkce MFC nevztahuje na verzi knihovny DLL, buď z důvodu technických omezení nebo protože tyto služby jsou obvykle poskytované aplikací.V aktuální verzi MFC je pouze funkce, která není použitelná CWinApp::SetDialogBkColor.

Vytváření knihovny DLL

Při sestavování pravidelných knihovny DLL, které staticky odkazují na MFC symboly _USRDLL a _WINDLL musí být definován.Rovněž musí být kompilována DLL kódu s kompilátorem následující přepínače:

  • /D_WINDLLoznačuje, že kompilace je pro knihovnu DLL

  • /D_USRDLLUrčuje, že vytváříte regulární DLL

Také musíte definovat tyto symboly a použít tyto parametry kompilátoru při kompilaci pravidelné knihovny DLL, které dynamické propojení MFC.Navíc symbol _AFXDLL musí být definovány a kódu DLL musí být kompilován s:

  • /D_AFXDLLUrčuje vytváření pravidelných knihovny DLL, která propojí dynamicky MFC

Rozhraní (API) mezi aplikací a knihovny DLL musí výslovně exportovány.Doporučujeme definovat vaše rozhraní pásma a používat pouze c rozhraní, pokud je to možné.Přímé c rozhraní je snadnější než složitější C++ tříd.

Místo v rozhraní API v samostatné záhlaví, které mohou obsahovat soubory c a C++.Viz záhlaví ScreenCap.h ve vzorku MFC pokročilé koncepty DLLScreenCap příklad.Chcete-li exportovat své funkce, zadejte je v EXPORTS části definiční soubor modulu (.DEF) nebo __declspec(dllexport) na vaše definice funkce.Použití __declspec(dllimport) do klientský spustitelný soubor importovat tyto funkce.

Je třeba přidat AFX_MANAGE_STATE makro na začátku exportovaných funkcí v pravidelných knihovny DLL, které dynamické propojení MFC.Toto makro nastaví aktuální stav modulu pro knihovnu DLL.Chcete-li použít toto makro přidejte následující řádek kódu na začátek funkce exportované z knihovny DLL:

AFX_MANAGE_STATE(AfxGetStaticModuleState( ))

WinMain - &gt; DllMain

Knihovna MFC definuje standardní Win32 DllMain vstupní bod, který inicializuje vaše CWinApp odvozené objekt jako v typické aplikace MFC.Umístěte všechny inicializace knihovny DLL specifické v InitInstance metodu jako v typické aplikace MFC.

Všimněte si, protože mechanismus CWinApp::Run se nevztahuje na knihovnu DLL, aplikace vlastní hlavní "message pump". Pokud se zobrazí nemodální dialogy nebo má hlavní rámec okno vlastní knihovny DLL vaše aplikace hlavní zpráva čerpadla musí volat rutina DLL vyvážené volá CWinApp::PreTranslateMessage.

Viz DLLScreenCap vzorku pro použití této funkce.

DllMain Funkce, která poskytuje MFC bude volat CWinApp::ExitInstance metoda třídy, která je odvozená od CWinApp před je knihovna DLL uvolněna.

Propojení knihovny DLL

Pravidelné knihovny DLL, které staticky odkazují na MFC musí vytvořit propojení knihovny DLL s Nafxcwd.lib nebo Nafxcw.lib a verze C Runtime s názvem Libcmt.lib.Tyto knihovny jsou předem připravené a mohou být nainstalovány zadáním je při spuštění instalačního programu Visual C++.

Ukázka kódu

Viz program DLLScreenCap pro celý vzorek MFC pokročilé koncepty vzorku.Poznámka: v tomto příkladu několik zajímavých věcí jsou následující:

  • Kompilátor příznaky knihovny DLL a aplikace, jsou různé.

  • Řádky propojení a.HD soubory DLL a pro použití se liší.

  • Aplikace, která používá knihovnu DLL nemá v jazyce C++.

  • Rozhraní mezi aplikací a knihovny DLL je rozhraní API, které je k dispozici c nebo C++ a je vyvezeno s DLLScreenCap.def.

Následující příklad ukazuje rozhraní API, které je definováno v pravidelných DLL, který staticky odkazuje na MFC.V tomto příkladu je ohraničen prohlášení extern "C" { } bloku pro uživatele C++.Má to několik výhod.Nejprve usnadňuje vaše knihovna DLL rozhraní API použitelné aplikacemi klient jazyka C++.Druhý zmenšuje režii knihovny DLL, protože úprava názvu C++ se neuplatní na exportovaný název.Nakonec ji usnadňuje explicitně přidat do.DEF souboru (pro export v řadové) bez starosti o pozměnění název.

#ifdef __cplusplus
extern "C" {
#endif  /* __cplusplus */

struct TracerData
{
    BOOL    bEnabled;
    UINT    flags;
};

BOOL PromptTraceFlags(TracerData FAR* lpData);

#ifdef __cplusplus
}
#endif

Struktury používá rozhraní API není odvozena od třídy MFC a jsou definovány v záhlaví rozhraní API.To snižuje složitost rozhraní mezi DLL a aplikací a umožňuje použitelné DLL C programy.

Viz také

Další zdroje

Technické poznámky podle čísla

Technické poznámky podle kategorie