Вопрос по dll, c++ – Что такое dllspec (dllimport) и dllspec (dllexport)

2

После поиска в Google я узнал, что Dllimport делает эту функцию доступной для других модулей,

Обязательно ли объявлять функцию с внешним идентификатором "c"?

Кроме того, Dllexport означает, что Dll сама использует функцию при компиляции. так по умолчанию все

функции, присутствующие в DLL, являются dllexport?

Ваш Ответ

3   ответа
19

__declspec(dllexport) экспортирует символ. Это делает его доступным извне DLL.

__declspec(dllimport) импортирует символ. Практически написано, что «этот символ не определен в этом приложении, его нужно импортировать из файла DLL».

Тебе не нужно объявлять это с помощьюextern "C". Если вы не используетеextern "C", тогда символ будет экспортирован как символ C ++, и вы сможете вызывать его только из C ++ (и языков, которые поддерживают вызов C ++ DLL). Если вы используетеextern "C", тогда символ будет экспортирован как символ C, и вы сможете вызывать его из языков, которые поддерживают вызов C DLL.

Если вы хотите использовать свою DLL в C #, вам нужно будет использоватьextern "C".

Вот отличный учебник, который показывает, как использовать C ++ DLL в C #: Как организовать класс C ++. Я использовал решение А во многих проектах на работе.

Кроме того, вот краткое руководство о том, как использовать C ++ DLL в другом приложении C ++: Как создать и использовать DLL в C ++.

8

что вы экспортируете его из DLL (или из исполняемого файла), чтобы другие модули (DLL или исполняемые файлы) могли использовать эту функцию.

dllimport используется для объявления функции, которая реализована в DLL (или, опять же, в исполняемом файле).

Так, в типичном случае у вас будет что-то вроде:

#ifdef BUILDDLL
#define DLL declspec(dllexport)
#else
#define DLL declspec(dllimport)
#endif

После каждой публичной функции DLL будет помечена какDLL:

DLL int dosomething(int);

Затем, когда вы создаете DLL, вы определитеBUILDDLL, чтобы все эти функции были помечены как dllexport. В противном случае вы включите в код клиента тот же заголовок, который должен использовать функцию (и). Это не будет определятьBUILDDLL, поэтому все они будут помечены как dllimport, поэтому, когда дело доходит до времени ссылки, он создаст ссылку на эту DLL вместо того, чтобы пытаться выполнить эти функции из какого-то места, например из стандартной библиотеки.

dllimport используется для объявления функции, которая реализована в DLL ?, для чего используется этот DLLimport? Naruto
@ LLL: это позволяет компилятору знать, что он исходит из DLL. Функция, поступающая из DLL, всегда вызывается через указатель, поэтому компилятор должен знать достаточно, чтобы сгенерировать это. Jerry Coffin
@ Ове: да, именно так. Jerry Coffin
@ Ben: Если вы собираетесь создать библиотеку DLL, которая экспортирует некоторые собственные функции и импортирует некоторые функции из других библиотек DLL, то да, каждая из них должна использовать свое имя. Jerry Coffin
@ LLL Допустим, вы делаете два проекта: MyDLL и MyApp. Вы определяете функцию в MyDLL, импортируете файл MyDLL.dll в MyApp.exe и вызываете функцию оттуда. Вам нужно использовать__declspec(dllexport) в проекте MyDLL (чтобы отметить, что вы экспортируете функцию. И вам нужно использовать__declspec(dllimport) в проекте MyApp, чтобы импортировать функцию из DLL. Ove
0

что записи (в виде статических таблиц импорта и экспорта) создаются (компоновщиком) в exe, dll..files, которые документируют зависимости между поставщиком и потребителем.

Похожие вопросы