Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > _export


Автор: mister2010 1.6.2010, 21:41
Что означает вот этот идентификатор _export? 

Автор: A5uKa 2.6.2010, 10:29
Создание библиотеки импорта этого.
export - получение из этой библиотеки этого, после её подключения.

Автор: Dem_max 2.6.2010, 11:59
говорим что мы хотим экспортировать переменную, функцию, класс и т.д.  из допустим DLL при статической линковке.

Автор: mister2010 2.6.2010, 13:32
Почему  _export должен находится внутри фигурных скобок 
Код

extern "C" {
void WINAPI _export masha()
               }

Автор: A5uKa 2.6.2010, 14:06
Не должен, а extern "C" полагаю означает, что Маша написана на C, так всё получается вполне логично )

Автор: mister2010 2.6.2010, 15:24
Когда я подключил скомпилированный длл к файлу екзе, каким образом идёт пользование экспортируемыми функциями, они вызываются в файле екзе?

Автор: Dem_max 2.6.2010, 18:20
ну как у тебя функции вызываются обычные, так и из DLL

Автор: mister2010 2.6.2010, 18:35
Файл езке вызывает функции которые я экспортировал?

Автор: mister2010 3.6.2010, 17:20
export - получение из этой библиотеки вызово функций, после её подключения, а екстерн, это для самого файла FAR.dll чтоб в этом файле  FAR.dll можно было реализовать функции, прототипы которых мы взяли из файла plugin.hpp?

Автор: bsa 4.6.2010, 22:50
mister2010, если не секрет, что у тебя с русским языком? Ну нельзя же делать столько ошибок!

Есть два кардинально противоположных ключевых слов (нестандартных): __export и __import. Когда ты пишешь библиотеку, то ты помечаешь все функции/классы/переменные атрибутом __export. Таким образом, эти объекты помещаются в публичную область библиотеки. Затем, когда ты пишешь программу, использующую эту библиотеку, ты помечаешь объявления тех же самых функций/классов/переменных словом __import. В этом случае компилятор будет пытаться найти указанные объекты в динамических библиотеках, которые ты подключаешь к проекту.
Правильные программисты народ ленивый (китайцы, индусы и им подобные не в счет). Им лень писать два раза один и тот же код, поэтому они делают один общий хидер с объявлениями функций/классов/переменных, используя макросы препроцессора для подстановки правильных __export/__import. Делается это так:
Код
#ifndef _MYHEADER_H
#define _MYHEADER_H

#ifdef MYLIB_BUILD
#define DLLPUBLIC __export
#else
#define DLLPUBLIC __import
#endif

class DLLPUBLIC MyClass
{
//....
};


extern "C" DLLPUBLIC void myfunc();

extern DLLPUBLIC int myvar;

#endif /* _MYHEADER_H */

extern "C" нужен для того, чтобы компилятор сгенерировал имя функции в стили языка С. Так как в противном случае будет очень сложно его узнать для ручного импорта из библиотеки (GetProcAddress).

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)