Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Specifické pro Microsoft
Třídy jazyka C++ můžete deklarovat pomocí atributu nebo dllexport atributudllimport. Z těchto formulářů vyplývá, že se importuje nebo exportuje celá třída. Třídy exportované tímto způsobem se nazývají exportovatelné třídy.
Následující příklad definuje exportovatelnou třídu. Exportují se všechny její členské funkce a statická data:
#define DllExport __declspec( dllexport )
class DllExport C {
int i;
virtual int func( void ) { return 1; }
};
Všimněte si, že explicitní použití dllimport a dllexport atributů u členů exportovatelné třídy je zakázáno.
dllexport – třídy
Když deklarujete třídu dllexport, exportují se všechny její členské funkce a statické datové členy. Je nutné zadat definice všech těchto členů ve stejném programu. V opačném případě se vygeneruje chyba linkeru. Jedinou výjimkou tohoto pravidla jsou čistě virtuální funkce, pro které nemusíte poskytovat explicitní definice. Vzhledem k tomu, že destruktor abstraktní třídy je vždy volána destruktoru pro základní třídu, musí čisté virtuální destruktory vždy poskytovat definici. Všimněte si, že tato pravidla jsou stejná pro neexportovatelné třídy.
Pokud exportujete data typu třídy nebo funkcí, které vracejí třídy, nezapomeňte třídu exportovat.
dllimport – třídy
Když deklarujete třídu dllimport, importují se všechny její členské funkce a statické datové členy. Na rozdíl od chování dllimport a dllexport u netřídních typů nemohou statické datové členy určit definici ve stejném programu, ve kterém dllimport je definována třída.
Dědičnost a exportovatelné třídy
Všechny základní třídy exportovatelné třídy musí být exportovatelné. Pokud ne, vygeneruje se upozornění kompilátoru. Kromě toho musí být exportovatelné všechny přístupné členy, které jsou také třídy. Toto pravidlo povoluje dllexport , aby třída dědila z dllimport třídy a dllimport třída dědila z dllexport třídy (i když se nedoporučuje). Obecně platí, že vše, co je přístupné klientovi knihovny DLL (podle pravidel přístupu jazyka C++), by mělo být součástí exportovatelného rozhraní. To zahrnuje soukromé datové členy odkazované ve vložených funkcích.
Selektivní import nebo export člena
Vzhledem k tomu, že členské funkce a statická data v rámci třídy implicitně mají externí propojení, můžete je deklarovat pomocí atributu dllimport nebo dllexport bez exportu celé třídy. Pokud je celá třída importována nebo exportována, explicitní deklarace členských funkcí a dat jako dllimport nebo dllexport je zakázána. Pokud deklarujete statický datový člen v definici třídy jako dllexport, musí definice nastat někde ve stejném programu (stejně jako u externího propojení mimo třídu).
Podobně můžete deklarovat členské funkce pomocí dllimport atributů.dllexport V tomto případě musíte zadat dllexport definici někde ve stejném programu.
Je vhodné si uvědomit několik důležitých bodů týkajících se selektivního importu a exportu členů:
Selektivní import/export člena je nejvhodnější pro poskytnutí verze exportovaného rozhraní třídy, které je více omezující; to znamená, že jeden, pro který můžete navrhnout knihovnu DLL, která zveřejňuje méně veřejných a privátních funkcí, než jazyk by jinak umožnil. Je také užitečné pro vyladění exportovatelného rozhraní: pokud víte, že klient podle definice nemá přístup k některým soukromým datům, není nutné exportovat celou třídu.
Pokud exportujete jednu virtuální funkci do třídy, musíte exportovat všechny z nich nebo alespoň zadat verze, které může klient používat přímo.
Pokud máte třídu, ve které používáte selektivní import/export členů s virtuálními funkcemi, musí být funkce v exportovatelném rozhraní nebo definované vložené (viditelné pro klienta).
Pokud definujete člena jako
dllexportčlena, ale nezahrňte ho do definice třídy, vygeneruje se chyba kompilátoru. Je nutné definovat člen v záhlaví třídy.Ačkoli definice členů třídy jako
dllimportnebodllexportje povolena, nelze přepsat rozhraní zadané v definici třídy.Pokud definujete členskou funkci na jiném místě než tělo definice třídy, ve které jste ji deklarovali, vygeneruje se upozornění, pokud je funkce definována jako
dllexportnebodllimport(pokud se tato definice liší od definice zadané v deklaraci třídy).
END Microsoft Specific