Sdílet prostřednictvím


Pomocí tříd C++ dllimport a dllexport

Konkrétní společnosti Microsoft

Deklarujete C++ třídy se dllimport nebo dllexport atributu.Tyto formuláře neznamená, že celou třídu je dovezené nebo vyvezené.Třídy vyvážené tímto způsobem se nazývají exportovatelný tříd.

Následující příklad definuje exportovatelný třídy.Jsou exportovány všechny funkce členů 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 atributy pro členy exportovatelný třídy je zakázáno.

Třídy dllexport

Při deklarování třídy dllexport, jsou exportovány všechny funkce členů a členy statická data.Je nutné zadat definice těchto členů ve stejném programu.Jinak je generována chyba linker.Jedinou výjimkou tohoto pravidla platí pro čisté virtuální funkce, pro které je nemusí poskytovat explicitní definice.Ale protože destruktoru základní třídy vždy volá destruktor abstraktní třídy, čistého virtuální destruktory musí vždy poskytují definice.Všimněte si, že tato pravidla jsou stejné pro třídy nonexportable.

Pokud exportujete data typu třídy nebo funkce, které vracejí tříd, nezapomeňte exportovat třídy.

Třídy DllImport.

Při deklarování třídy dllimport, jsou importovány všechny funkce členů a členy statická data.Na rozdíl od chování dllimport a dllexport nonclass typy statická data členů nelze zadat definici ve stejné aplikaci, ve které dllimport je definována třída.

Dědičnost a exportovat třídy

Všechny základní třídy exportovatelný třídy musí být exportovatelný.Pokud tomu tak není, je generována upozornění kompilátoru.Kromě toho musí být všechny dostupné členy, kteří jsou také třídy exportovat.Toto pravidlo povoluje dllexport dědit ze třídy dllimport třídy a dllimport dědit ze třídy dllexport třídy (i když ten není doporučeno).Zpravidla vše, které je přístupné knihovně DLL klienta (podle pravidla přístupu C++) by měly být součástí exportovatelný rozhraní.To zahrnuje členy soukromých dat odkazuje vložené funkce.

Selektivní členské Import a Export

Protože funkce členů a statická data v rámci třídy mají implicitně externí navázání, můžete deklarovat s dllimport nebo dllexport , pokud je exportovat celou třídu atributu.Pokud je dovezené nebo vyvezené, explicitní deklaraci členské funkce a data jako celou třídu dllimport nebo dllexport je zakázáno.Pokud deklarujete statický datový člen v rámci definice třídy jako dllexport, definice musí dojít někde v rámci stejného programu (jako při navázání externí nonclass).

Podobně můžete deklarovat členské funkce s dllimport nebo dllexport atributy.V tomto případě je nutné zadat dllexport definice někde v rámci stejného programu.

Je vhodné si uvědomit několik důležitých bodů, týkající se členů výběrové import a export:

  • Selektivní členské exportu je nejvhodnější pro poskytování verze exportovaného třídy rozhraní, které je více omezující; jeden pro kterou navrhujete knihovny DLL, která poskytuje méně funkcí než ve veřejných a soukromých by jinak mohl.Je také užitečné pro jemné doladění exportovatelný rozhraní: Pokud víte, že je klient podle definice nelze získat přístup k některé soukromých dat, nutné exportovat celou třídu.

  • Při exportu jednu virtuální funkci ve třídě, musí exportovat všechna nebo alespoň poskytnout verze, které může klient použít přímo.

  • Pokud je třída, ve kterém používáte exportu selektivní členské funkce virtuální, funkce musí být exportovatelný rozhraní nebo definice vložené (viditelné klientovi).

  • Pokud definujete jako člen dllexport , ale nebudou zahrnuty do definice třídy, je generována chyba kompilátoru.V záhlaví třídy musí definovat člen.

  • Ačkoliv definice třídy členy jako dllimport nebo dllexport je povoleno, nemůže přepsat rozhraní zadané v definici třídy.

  • Pokud definujete v místě než subjekt definice třídy, v němž deklaraci je členské funkce, je generováno upozornění, pokud je funkce je definována jako dllexport nebo dllimport (Pokud tato definice se liší od zadané v deklaraci třídy).

Viz také

Referenční dokumentace

dllexport dllimport.