Импорт классов из DLL
От: Аноним  
Дата: 14.01.08 17:10
Оценка:
Как это сделать грамотно?

Я делаю следующим образом:

Взаголовке для программы-пользователя DLL сначала стандартные директивы (как и в заголовке из проекта для DLL):


#ifdef LOG_EXPORTS
#define LOG_API __declspec(dllexport)
#else 
#define LOG_API __declspec(dllimport)
#endif


Затем привожу определение класса:

class LOG_API Log :
    public ofstream
{
public:
     Log(const char* szFn=DEFAULT_LOG_FILE,openmode om=DEFAULT_OPEN_MODE);
     int openLog(const char* szFn=DEFAULT_LOG_FILE,openmode om=DEFAULT_OPEN_MODE);
//    ifstream& operator <<(const char* szMsg); 
//    ifstream& operator <<(unsigned n); 
public:
    void closeLog(); 
    ~Log(void);
};


Но при компиляции в Visual Studio 2005 получаю ошибку:
error C2470: 'Log' : looks like a function definition, but there is no parameter list; skipping apparent body

На строке class LOG_API Log :. Пробовал вместо LOG_API явно указывать __declspec(dllimport) — та же ошибка.
Re: Импорт классов из DLL
От: Left2 Украина  
Дата: 14.01.08 17:22
Оценка: -1
Импортировать/экспортировать через __declspec надо не класс целиком, а отдельные функции этого класса (в т.ч. конструкторы, деструкторы и т.п.).
... << RSDN@Home 1.2.0 alpha rev. 717>>
Re[2]: Импорт классов из DLL
От: ArtDenis Россия  
Дата: 14.01.08 19:13
Оценка:
Здравствуйте, Left2, Вы писали:

L>Импортировать/экспортировать через __declspec надо не класс целиком, а отдельные функции этого класса (в т.ч. конструкторы, деструкторы и т.п.).


Э-э... Как это?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re: Импорт классов из DLL
От: landerhigh Пират  
Дата: 14.01.08 23:21
Оценка:
Здравствуйте, Аноним, Вы писали:


А>На строке class LOG_API Log :. Пробовал вместо LOG_API явно указывать __declspec(dllimport) — та же ошибка.


Импорт с экспортом не путаете?
www.blinnov.com
Re: Импорт классов из DLL
От: SL555 Россия  
Дата: 15.01.08 03:14
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Как это сделать грамотно?


А>Я делаю следующим образом:


А>Взаголовке для программы-пользователя DLL сначала стандартные директивы (как и в заголовке из проекта для DLL):



А>
А>#ifdef LOG_EXPORTS
А>#define LOG_API __declspec(dllexport)
А>#else 
А>#define LOG_API __declspec(dllimport)
А>#endif
А>


А>Затем привожу определение класса:


А>
А>class LOG_API Log :
А>    public ofstream
А>{
А>public:
А>     Log(const char* szFn=DEFAULT_LOG_FILE,openmode om=DEFAULT_OPEN_MODE);
А>     int openLog(const char* szFn=DEFAULT_LOG_FILE,openmode om=DEFAULT_OPEN_MODE);
А>//    ifstream& operator <<(const char* szMsg); 
А>//    ifstream& operator <<(unsigned n); 
А>public:
А>    void closeLog(); 
А>    ~Log(void);
А>};
А>


А>Но при компиляции в Visual Studio 2005 получаю ошибку:

А>
А>error C2470: 'Log' : looks like a function definition, but there is no parameter list; skipping apparent body
А>

А>На строке class LOG_API Log :. Пробовал вместо LOG_API явно указывать __declspec(dllimport) — та же ошибка.

Сымый простой вариант, экспортировать функцию, которая возвращает указатель не объект класс Log.

в dll

class cLog
{
................
}
потом в .cpp

cLog  theLog; //он может быть как статический, так и можно его постоянно создовать через new при вызове GetLog
extern "C" __declspec(dllexport) cLog * PASCAL  GetLog()
{
    
    return &theLog;
}



и все в клиенте через LoadLibrary, загружаешь Dll, через GetProcAddress получаешь указатель на GetLog:

GetProcAddress( m_hModule, "_GetLog@0" ) )


и собственно все;
Re[2]: Импорт классов из DLL
От: Аноним  
Дата: 15.01.08 07:19
Оценка:
Здравствуйте, SL555, Вы писали:

SL>Сымый простой вариант, экспортировать функцию, которая возвращает указатель не объект класс Log.

Мы , комсомольцы, без трудностей не можем?!

Проверь, что в месте декларации Log макросы LOG_EXPORTS и LOG_API определены
Re[2]: Импорт классов из DLL
От: MasterZiv СССР  
Дата: 15.01.08 11:54
Оценка: 1 (1)
Left2 пишет:

> Импортировать/экспортировать через __declspec надо не класс целиком, а

> отдельные функции этого класса (в т.ч. конструкторы, деструкторы и т.п.).

Можно и так, и так, но как раз более распространенным подходом
является экспортировать/импортировать класс именно целиком.
Posted via RSDN NNTP Server 2.1 beta
Re[3]: Импорт классов из DLL
От: Left2 Украина  
Дата: 15.01.08 15:23
Оценка:
L>>Импортировать/экспортировать через __declspec надо не класс целиком, а отдельные функции этого класса (в т.ч. конструкторы, деструкторы и т.п.).

AD>Э-э... Как это?


Вот так:

class A
{
__declspec(export) A();
__declspec(export) ~A();
};


Впрочем, народ утверждает что целиком тоже можно. Что ж — век живи — век учись (а помрёшь дубина дубиной... )
... << RSDN@Home 1.2.0 alpha rev. 717>>
Re: Импорт классов из DLL
От: Аноним  
Дата: 15.01.08 16:16
Оценка:
Кажется, я понял, где напортачил — в другом файле объявил "#define __declspec(dllimport) <другое_имя>" вместо "#define __declspec(dllimport) <другое_имя>", поэтому при обработке __declspec препроцессор подставлял перед классом Log то самое <другое_имя>. Переставил местами и теперь всё собирается. С указателями я тоже одно время думал сделать, но потом решил без них обойтись. Есть ли какие-нибудь подводные камни при использовании классов из DLL а ля "как есть" помимо того, что автоматическая конструкция/деструкция не происходит и их надо вызывать явно?
Re[2]: Импорт классов из DLL
От: Аноним  
Дата: 16.01.08 08:01
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Есть ли какие-нибудь подводные камни при использовании классов из DLL а ля "как есть" помимо того, что автоматическая конструкция/деструкция не происходит и их надо вызывать явно?

Всегда вроде происходила.

Потенциальные грабли при статческой линковки рантайма:
Память нужно освобождать в том же модуле, где паиять выделена. Иначе будут проблемы
Re[3]: Импорт классов из DLL
От: Аноним  
Дата: 16.01.08 11:39
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Аноним, Вы писали:


А>>Есть ли какие-нибудь подводные камни при использовании классов из DLL а ля "как есть" помимо того, что автоматическая конструкция/деструкция не происходит и их надо вызывать явно?

А>Всегда вроде происходила.

А>Потенциальные грабли при статческой линковки рантайма:

А>Память нужно освобождать в том же модуле, где паиять выделена. Иначе будут проблемы


С памятью вроде ясно. Мои недопонимания по поводу конструкторов/деструкторов были связаны с тем, что в конструкторах не вызывались инициализаторы членов. Однако, после определения DllMain и указания в VS использовать ее как Entry Point, инициализация заработала. Хотя в DllMain нет никакого полезного кода...
Re[3]: Импорт классов из DLL
От: MasterZiv СССР  
Дата: 16.01.08 14:49
Оценка:
Аноним 617 wrote:

> Потенциальные грабли при статческой линковки рантайма:

> Память нужно освобождать в том же модуле, где паиять выделена. Иначе
> будут проблемы

Статически линковать CRTL, если используешь .dll вообще нельзя.
Ну т.е. можно, если хочешь гемора себе нажить.
Как только будешь использовать нереентерабельные функции CRTL
более чем из одного модуля (.exe.dll) — сразу нарвешься на неприятности.
Posted via RSDN NNTP Server 2.1 beta
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.