Za pomocą elementu dllimport i dllexport w klasach C++
Programu Microsoft
Można zadeklarować klasy C++ z dllimport lub dllexport atrybut.Formularze te oznacza, że cała klasa jest przywożonych lub wywożonych.Klas wywożonych w ten sposób są określane jako możliwy do eksportowania klas.
Poniższy przykład definiuje klasę możliwy do eksportowania.Jego funkcji elementów członkowskich i dane statyczne są eksportowane:
#define DllExport __declspec( dllexport )
class DllExport C {
int i;
virtual int func( void ) { return 1; }
};
Należy zauważyć, że wykorzystanie jawne dllimport i dllexport atrybuty członkowie eksportowalnych klasy jest zabronione.
Klasy dllexport
Kiedy zadeklarować klasy dllexport, jego funkcji elementów członkowskich i członków dane statyczne są eksportowane.Musisz podać definicji takich członków w tym samym programie.W przeciwnym wypadku zostanie wygenerowany błąd programu łączącego.Jedynym wyjątkiem od tej zasady stosuje się do czystego funkcje wirtualnych, dla których nie muszą dostarczyć jawne definicje.Jednakże ponieważ destruktora klasy abstrakcyjne zawsze jest wywoływana przez destruktor klasy podstawowej, czystego destruktory wirtualny musi zawsze zawierają definicje.Należy zauważyć, że zasady te są takie same dla klasy nonexportable.
Podczas eksportowania danych typu klasy lub funkcje, które zwracają klas, należy wyeksportować klasy.
Klasy DllImport
Kiedy zadeklarować klasy dllimport, jego funkcji elementów członkowskich i członków dane statyczne są przywożone.W przeciwieństwie do zachowania dllimport i dllexport na typy nonclass członkowie danych statycznych nie można określić definicję w tym samym programie, w którym dllimport klasa jest zdefiniowana.
Dziedziczenie i możliwy do eksportowania klas
Wszystkie klasy podstawowej eksportowalne klasy musi być możliwy do eksportowania.Jeśli nie jest generowane ostrzeżenie kompilatora.Ponadto wszystkie dostępne elementy członkowskie, które są również klasy musi być możliwy do eksportowania.Zasada ta pozwala na dllexport dziedziczą z klasy dllimport klasy i dllimport dziedziczą z klasy dllexport klasy (chociaż ten ostatni nie jest zalecane).Jako zasada wszystko, co jest dostępne dla klienta biblioteki DLL (zgodnie z zasadami dostępu C++) powinny być częścią interfejsu można eksportować.Dotyczy to członków prywatnych danych, do których odwołuje się wbudowane funkcje.
Selektywne Członkowskie importu/eksportu
Ponieważ funkcje składowe i danych statycznych w klasie niejawnie mają powiązania zewnętrznych, można zadeklarować je z dllimport lub dllexport atrybutu, chyba że jest eksportowany cały klasy.Jeśli cała klasa jest przywożonych lub wywożonych, jawnej deklaracji funkcji elementów członkowskich i danych jako dllimport lub dllexport jest zabronione.Zadeklarować Członkowskich danych statycznych w ramach definicji klasy jako dllexport, definicja musi wystąpić gdzieś w ramach tego samego programu (podobnie jak w przypadku powiązania zewnętrznych nonclass).
Podobnie można zadeklarować Członkowskich funkcje z dllimport lub dllexport atrybuty.W takim przypadku należy podać dllexport definicji w obrębie tego samego programu.
Warto zwrócić uwagę kilku istotnych kwestiach dotyczących selektywne Członkowskim przywozu i wywozu:
Selektywne Członkowskie importu/eksportu najlepiej nadaje się do dostarczanie wersji interfejsu klasy wywożonych, który jest bardziej restrykcyjne; oznacza to, że jeden, dla których można projektować biblioteki DLL, która udostępnia mniej funkcji publicznych i prywatnych, niż język inaczej pozwoliłoby.Jest on również przydatny w operacjach dostosowawczych eksportowalne interfejsu: gdy wiadomo, że klient, z definicji, nie ma dostępu do niektórych danych prywatnych, nie muszą eksportować całej klasy.
Podczas eksportowania jedną funkcję wirtualną w klasie, musi je wszystkie wyeksportować lub co najmniej zapewnić wersje, które klient może używać bezpośrednio.
Jeśli klasy, w którym są przy użyciu selektywne Członkowskie importu/eksportu, funkcje wirtualnych funkcji musi być możliwy do eksportowania interfejsu lub określone wbudowane (widoczny dla klienta).
W przypadku zdefiniowania Członkowskie jako dllexport , ale nie należy umieszczać w definicji klasy, generowany jest błąd kompilatora.W nagłówku klasy, musisz zdefiniować członka.
Chociaż definicja klasy członków jako dllimport lub dllexport jest dozwolone, nie można zastąpić interfejsu, określonych w definicji klasy.
W przypadku definiowania funkcji składowej w miejscu innym niż jednostka definicji klasy ona zadeklarowana jest generowane ostrzeżenie, jeśli funkcja jest zdefiniowana jako dllexport lub dllimport (Jeśli definicja ta różni się od określonego w deklaracji klasy).