Sdílet prostřednictvím


Používání příkazů dllimport a dllexport ve třídách jazyka C++

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 dllimport nebo dllexport je 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 dllexport nebo dllimport (pokud se tato definice liší od definice zadané v deklaraci třídy).

END Microsoft Specific

Viz také

dllexport, dllimport