![]() |
|
|
![]()
|
|
| Delphist |
|
|||
![]() Delphist Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2145 Регистрация: 3.2.2004 Где: всегда в сети Репутация: нет Всего: 3 |
Понятно, что это препроцессорные директива в зависимости от того определ или не определен 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-функций, разбор приложения на окна мн.др). Когда-то давным-давно использовал это... |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 2 Всего: 154 |
импорт - экспорт функции из dll
|
|||
|
||||
| Delphist |
|
|||
![]() Delphist Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2145 Регистрация: 3.2.2004 Где: всегда в сети Репутация: нет Всего: 3 |
Не совсем понял, define OPENGL_GUIRENDERER_API собственно определить OPENGL_GUIRENDERER_API, т.е. это означает что при опросе - ifdef OPENGL_GUIRENDERER_API данное условие будет истинным, но причем здесь __declspec(dllexport) что оно делает, если можно на конкретном примере объяснить для чего это нужно. -------------------- ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др). Когда-то давным-давно использовал это... |
|||
|
||||
| dizzy1984 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 675 Регистрация: 15.2.2007 Репутация: 10 Всего: 25 |
В си означает "при встрече строки "OPENGL_GUIRENDERER_API" заменить ее на строку "__declspec(dllexport)"" Приведенный кусок кода позволяет сократить объем текста путем использования одного (вместо 2-х) хедера в двух проектах - 1-й проект для компиляции *.dll, второй для ее использования. При этом в первом случае определяется макрос "OPENGL_GUIRENDERER_EXPORTS", во втором случае он не определяется. |
|||
|
||||
| Delphist |
|
|||
![]() Delphist Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2145 Регистрация: 3.2.2004 Где: всегда в сети Репутация: нет Всего: 3 |
Что значит макрос, на месте "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-функций, разбор приложения на окна мн.др). Когда-то давным-давно использовал это... |
|||
|
||||
| Damarus |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 671 Регистрация: 6.5.2006 Репутация: 6 Всего: 29 |
Врядли ты такую запись встретишь. Скорее будет чтото вроде:
|
|||
|
||||
| Delphist |
|
|||
![]() Delphist Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2145 Регистрация: 3.2.2004 Где: всегда в сети Репутация: нет Всего: 3 |
встретил, в примерах к библиотеке CEGui. я так и не понял, все же что такое __declspec(dllexport) и __declspec(dllimport) ? -------------------- ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др). Когда-то давным-давно использовал это... |
|||
|
||||
| voov |
|
||||
![]() Патамушта мы пилоты ![]() ![]() Профиль Группа: Участник Сообщений: 460 Регистрация: 29.11.2007 Репутация: 8 Всего: 8 |
Как сказал Lazin, это
Такая конструкция обычно используется при написании длл. В хедере длл *.h вверху пишется
ниже в той же ашке идут классы и методы длл, которые экспортируются/импортируются
Этот хедер используется и в проекте длл и в проектах, где эта длл используется. В проетке длл дефайнится символ OPENGL_GUIRENDERER_EXPORTS и в ашке все что с символом OPENGL_GUIRENDERER_API заменяется на __declspec(dllexport) и соответственно экспортируется из длл. А в проекте, который использует эту длл символ OPENGL_GUIRENDERER_EXPORTS не дефайнится и все OPENGL_GUIRENDERER_API заменяются на __declspec(dllimport) - импорт из длл. |
||||
|
|||||
| Delphist |
|
||||
![]() Delphist Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2145 Регистрация: 3.2.2004 Где: всегда в сети Репутация: нет Всего: 3 |
Здесь понятно (
но что значит вот эта запись
как это класс может экспортироваться не понял? -------------------- ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др). Когда-то давным-давно использовал это... |
||||
|
|||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 2 Всего: 154 |
может, только и библиотека и приложение должны компилироваться одним компилятором
|
|||
|
||||
| voov |
|
|||
![]() Патамушта мы пилоты ![]() ![]() Профиль Группа: Участник Сообщений: 460 Регистрация: 29.11.2007 Репутация: 8 Всего: 8 |
опять же для удобства. такая запись означает, что экспортируются все функции этого класса. и при этом можно не писать __declspec(dllexport) при объявлении каждой функции. При следущей записи функция doSomeTh(); будет экспортирована.
|
|||
|
||||
| Delphist |
|
|||
![]() Delphist Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2145 Регистрация: 3.2.2004 Где: всегда в сети Репутация: нет Всего: 3 |
ммм, не знал, спасибо, терь понятно -------------------- ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др). Когда-то давным-давно использовал это... |
|||
|
||||
| Delphist |
|
|||
![]() Delphist Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2145 Регистрация: 3.2.2004 Где: всегда в сети Репутация: нет Всего: 3 |
Сейчас возник вопрос, а как ты можешь экспортировать функцию, которая является членом класса. Если она была бы класс-функцией то да, тогда бы мы могли ее экспортировать.
Может быть, мы под словом экспортировать понимаем разные вещи. Я под экспортированием понимаю, то что часто используется в dll, например, я пишу ф-цию, а затем ставлю слово exports (так для Delphi) и имена ф-ций, который хочу экспортировать Это сообщение отредактировал(а) Delphist - 10.9.2008, 13:57 -------------------- ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др). Когда-то давным-давно использовал это... |
|||
|
||||
| Lazin |
|
||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 2 Всего: 154 |
в общем, как уже сказал voov dllexport dllimport для класса, эквивалентно применению этих директив(я правильно их называю?) ко всем функциям членам класса, только добавляется "синтаксический сахар" и можно работать так, как буд-то экспортируются и импортируются сами классы, то-есть, если есть класс
то реально будет эеспортировано что-то вроде
а при импорте,
компилятор будет искать в длл функцию
как-то так |
||||||||
|
|||||||||
| voov |
|
|||
![]() Патамушта мы пилоты ![]() ![]() Профиль Группа: Участник Сообщений: 460 Регистрация: 29.11.2007 Репутация: 8 Всего: 8 |
Если не вдаваться в технические подробности и говорить абстрактно, то: Экспортировать функцию (из длл) - значит сделать ее доступной клиентам, которые используют эту длл. Импортировать функцию (в программу) - значит сообщить, что функция из длл будет использована в программе. |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |