Jaka jest różnica między dllexport i dllimport?

Szukam tylko prostego, zwięzłego wyjaśnienia różnicy między tymi dwoma. MSDN nie zajmuje się tu zbyt wieloma szczegółami.

Author: Aardvark, 2008-09-12

4 answers

  • __declspec(dllexport) mówi linkerowi, że chcesz, aby ten obiekt był dostępny dla innych bibliotek DLL do importowania. Jest on używany podczas tworzenia biblioteki DLL, do której inni mogą się łączyć.

  • __declspec(dllimport) importuje implementację z biblioteki DLL, aby aplikacja mogła z niej korzystać.

Jestem dopiero początkującym programistą C / C++, więc może ktoś ma lepsze wyjaśnienie niż ja.

 51
Author: rpetrich,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-05 09:55:54

__declspec( dllexport ) - tak oznaczona klasa lub funkcja zostanie wyeksportowana z biblioteki DLL, w której jest wbudowana. Jeśli budujesz bibliotekę DLL i chcesz API, musisz użyć tego lub oddzielnego.Plik DEF definiujący eksport ( MSDN ). Jest to przydatne, ponieważ utrzymuje definicję w jednym miejscu, ale .Plik DEF zawiera więcej opcji.

__declspec( dllimport ) - tak oznaczona klasa lub funkcja zostanie zaimportowana z biblioteki DLL. W rzeczywistości nie jest to wymagane - potrzebujesz biblioteki importu w każdym razie , aby linker happy. Gdy jednak zostanie poprawnie oznaczony dllimport, kompilator i linker mają wystarczająco dużo informacji, aby zoptymalizować wywołanie; bez niego, można uzyskać normalne statyczne linkowanie do funkcji wejściowej w bibliotece importu, która dodaje niepotrzebne przekierowanie. ONT1 ONT2

 87
Author: Shog9,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-12 01:05:37

Dwa różne przypadki użycia:

1) definiujesz implementację klasy w dll. Chcesz inny program do korzystania z klasy. Tutaj używasz dllexport podczas tworzenia klasy, którą chcesz, aby dll ujawnił.

2) używasz funkcji dostarczonej przez bibliotekę dll. Dołączasz nagłówek dołączony do biblioteki dll. Tutaj nagłówek używa dllimport do wprowadzenia implementacji, która ma być używana przez bieżący program.

Często ten sam plik nagłówkowy jest używany w obu przypadkach i makro zdefiniowane. Konfiguracja budowania definiuje makro do importu lub eksportu w zależności od potrzeb.

 10
Author: morechilli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-12 00:43:32

Dllexport służy do oznaczania funkcji jako wyeksportowanej. Możesz zaimplementować funkcję w DLL i wyeksportować go tak, aby stał się Dostępny dla każdego za pomocą DLL.

Dllimport jest odwrotnie: oznacza funkcję jako importowaną z biblioteki DLL. W takim przypadku deklarujesz tylko podpis funkcji i łączysz kod z biblioteką.

 9
Author: Antoine Aubry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-12 00:43:34