Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Что означает __declspec(dllexport) и__declspec(dll 
:(
    Опции темы
Delphist
  Дата 8.9.2008, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

Репутация: нет
Всего: 3



Код

#if (defined( __WIN32__ ) || defined( _WIN32 )) && !defined(CEGUI_STATIC)
#   ifdef OPENGL_GUIRENDERER_EXPORTS
#       define OPENGL_GUIRENDERER_API __declspec(dllexport)
#   else
#       define OPENGL_GUIRENDERER_API __declspec(dllimport)
#   endif
#else
#   define OPENGL_GUIRENDERER_API
#endif

Понятно, что это препроцессорные директива в зависимости от того определ или не определен OPENGL_GUIRENDERER_EXPORTS, выполняется определяется или define OPENGL_GUIRENDERER_API __declspec(dllexport) или define OPENGL_GUIRENDERER_API __declspec(dllimport).
Но не со всем понятно, что значит __declspec(dllexport) и __declspec(dllimport)? 


Это сообщение отредактировал(а) Delphist - 8.9.2008, 18:27


--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
Lazin
Дата 8.9.2008, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 2
Всего: 154



импорт - экспорт функции из dll
PM MAIL Skype GTalk   Вверх
Delphist
  Дата 8.9.2008, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

Репутация: нет
Всего: 3



Цитата(Lazin @  8.9.2008,  19:38 Найти цитируемый пост)
импорт - экспорт функции из dll 

Не совсем понял, define OPENGL_GUIRENDERER_API собственно определить OPENGL_GUIRENDERER_API, т.е. это означает
что при опросе - ifdef OPENGL_GUIRENDERER_API данное условие будет истинным, но причем здесь __declspec(dllexport)
что оно делает, если можно на конкретном примере объяснить для чего это нужно.



--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
dizzy1984
Дата 9.9.2008, 06:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 675
Регистрация: 15.2.2007

Репутация: 10
Всего: 25



Цитата(Delphist @  8.9.2008,  20:25 Найти цитируемый пост)
#       define OPENGL_GUIRENDERER_API __declspec(dllexport)

В си означает "при встрече строки "OPENGL_GUIRENDERER_API" заменить ее на строку "__declspec(dllexport)""
Приведенный кусок кода позволяет сократить объем текста путем использования одного (вместо 2-х) хедера в двух проектах - 1-й проект для компиляции *.dll, второй для ее использования. При этом в первом случае определяется макрос "OPENGL_GUIRENDERER_EXPORTS", во втором случае он не определяется.
PM MAIL   Вверх
Delphist
Дата 9.9.2008, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

Репутация: нет
Всего: 3



Цитата(dizzy1984 @  9.9.2008,  07:40 Найти цитируемый пост)
макрос "OPENGL_GUIRENDERER_EXPORTS", 

Что значит макрос, на месте "OPENGL_GUIRENDERER_EXPORTS" я мог написать любой текс, просто написав 
#define OPENGL_GUIRENDERER_EXPORTS, у нас конструкция 
#ifdef OPENGL_GUIRENDERER_EXPORTS 
вернет True, в противном случае, если бы мы не написали бы #define OPENGL_GUIRENDERER_EXPORTS
#ifdef OPENGL_GUIRENDERER_EXPORTS возращал бы False, вот и вся разница. Ну с этим все понятно.
Не совсем понятно, что делает вот эта вещь  define OPENGL_GUIRENDERER_API __declspec(dllexport) точнее понятно
что определяется define OPENGL_GUIRENDERER_API, но не понятно что делает __declspec(dllexport) и 
__declspec(dllimport)
Если учитывать сказанное dizzy1984, то получается что если мы встретив в исходнике запись, типа:
ifdef OPENGL_GUIRENDERER_API, то компилятор в случае если определен OPENGL_GUIRENDERER_EXPORTS, подставит так: ifdef __declspec(dllexport) в противном случае ifdef __declspec(dllimport) и вот тут становиться не понятно __declspec(dllexport) это ф-ция или что? непонятно.


--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
Damarus
Дата 9.9.2008, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 671
Регистрация: 6.5.2006

Репутация: 6
Всего: 29



Цитата(Delphist @  9.9.2008,  10:19 Найти цитируемый пост)
Если учитывать сказанное dizzy1984, то получается что если мы встретив в исходнике запись, типа:
ifdef OPENGL_GUIRENDERER_API, то компилятор в случае если определен OPENGL_GUIRENDERER_EXPORTS, подставит так: ifdef __declspec(dllexport) в противном случае ifdef __declspec(dllimport) и вот тут становиться не понятно __declspec(dllexport) это ф-ция или что? непонятно.

Врядли ты такую запись встретишь. Скорее будет чтото вроде:
Код

OPENGL_GUIRENDERER_API void __cdecl Function1(void);

PM MAIL ICQ Jabber   Вверх
Delphist
Дата 9.9.2008, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

Репутация: нет
Всего: 3



Цитата(Damarus @  9.9.2008,  10:42 Найти цитируемый пост)
OPENGL_GUIRENDERER_API void __cdecl Function1(void);

встретил, в примерах к библиотеке CEGui.
я так и не понял, все же что такое __declspec(dllexport) и __declspec(dllimport) ?


--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
voov
Дата 9.9.2008, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Патамушта мы пилоты
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 29.11.2007

Репутация: 8
Всего: 8



Как сказал Lazin, это
Цитата(Lazin @  8.9.2008,  18:38 Найти цитируемый пост)
импорт - экспорт функции из dll 


Такая конструкция обычно используется при написании длл. В хедере длл *.h вверху пишется 
Код

   ifdef OPENGL_GUIRENDERER_EXPORTS
       define OPENGL_GUIRENDERER_API __declspec(dllexport)     // экспорт функции в длл
   else
       define OPENGL_GUIRENDERER_API __declspec(dllimport)     // импорт функции из длл
   endif

ниже в той же ашке идут классы и методы длл, которые экспортируются/импортируются
Код

class OPENGL_GUIRENDERER_API CExemple : public CObject
...
OPENGL_GUIRENDERER_API void doSomeTh();

Этот хедер используется и в проекте длл и в проектах, где эта длл используется.
В проетке длл дефайнится символ OPENGL_GUIRENDERER_EXPORTS и в ашке все что с символом OPENGL_GUIRENDERER_API заменяется на  __declspec(dllexport) и соответственно экспортируется из длл.
А в проекте, который использует эту длл символ OPENGL_GUIRENDERER_EXPORTS не дефайнится и все OPENGL_GUIRENDERER_API заменяются на __declspec(dllimport) - импорт из длл.
PM MAIL   Вверх
Delphist
Дата 9.9.2008, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

Репутация: нет
Всего: 3



Цитата(voov @  9.9.2008,  12:11 Найти цитируемый пост)
OPENGL_GUIRENDERER_API void doSomeTh();

Здесь понятно (
Код

__declspec(dllexport) void doSomeTh()
)  мы указали что происходит экспортирование процедуры doSomeTh 

Цитата(voov @  9.9.2008,  12:11 Найти цитируемый пост)
class OPENGL_GUIRENDERER_API CExemple : public CObject

но что значит вот эта запись 
Код
 
class __declspec(dllexport) CExemple : public CObject

как это класс может экспортироваться не понял?


--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
Lazin
Дата 9.9.2008, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 2
Всего: 154



может, только и библиотека и приложение должны компилироваться одним компилятором
PM MAIL Skype GTalk   Вверх
voov
Дата 9.9.2008, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Патамушта мы пилоты
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 29.11.2007

Репутация: 8
Всего: 8



Цитата(Delphist @  9.9.2008,  12:58 Найти цитируемый пост)
как это класс может экспортироваться не понял?

опять же для удобства. такая запись означает, что экспортируются все функции этого класса. и при этом можно не писать __declspec(dllexport) при объявлении каждой функции. При следущей записи функция doSomeTh(); будет экспортирована.
Код

 class __declspec(dllexport) CExemple : public CObject {
   void doSomeTh();
}

PM MAIL   Вверх
Delphist
Дата 9.9.2008, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

Репутация: нет
Всего: 3



Цитата(voov @  9.9.2008,  14:58 Найти цитируемый пост)
При следущей записи функция doSomeTh(); будет экспортирована.

ммм, не знал, спасибо, терь понятно


--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
Delphist
Дата 10.9.2008, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

Репутация: нет
Всего: 3



Сейчас возник вопрос, а как ты можешь экспортировать функцию, которая является членом класса. Если она была бы класс-функцией то да, тогда бы мы могли ее экспортировать.
Может быть, мы под словом экспортировать понимаем разные вещи. Я под экспортированием понимаю, то что часто используется в dll, например, я пишу ф-цию, а затем ставлю слово exports (так для Delphi) и имена ф-ций, который хочу экспортировать

Это сообщение отредактировал(а) Delphist - 10.9.2008, 13:57


--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
Lazin
Дата 10.9.2008, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 2
Всего: 154



в общем, как уже сказал voov dllexport dllimport для класса, эквивалентно применению этих директив(я правильно их называю?) ко всем функциям членам класса, только добавляется "синтаксический сахар" и можно работать так, как буд-то экспортируются и импортируются сами классы, то-есть, если есть класс
Код

__declspec(dllexport) class Foo
{
void bar();
};

то реально будет эеспортировано что-то вроде
Код

void __declspec(dllexport) Foo::bar(Foo*);

а при импорте, 
Код

__declspec(dllimport) class Foo
{
void bar();
};

компилятор будет искать в длл функцию
Код

void __declspec(dllimport) Foo::bar(Foo*);

как-то так
PM MAIL Skype GTalk   Вверх
voov
Дата 10.9.2008, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Патамушта мы пилоты
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 29.11.2007

Репутация: 8
Всего: 8



Цитата(Delphist @  10.9.2008,  13:56 Найти цитируемый пост)
Может быть, мы под словом экспортировать понимаем разные вещи. 

Если не вдаваться в технические подробности и говорить абстрактно, то:
Экспортировать функцию (из длл) - значит сделать ее доступной клиентам, которые используют эту длл.
Импортировать функцию (в программу) - значит сообщить, что функция из длл будет использована в программе.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0596 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.