Left2 пишет:
> Импортировать/экспортировать через __declspec надо не класс целиком, а > отдельные функции этого класса (в т.ч. конструкторы, деструкторы и т.п.).
Можно и так, и так, но как раз более распространенным подходом
является экспортировать/импортировать класс именно целиком.
Здравствуйте, Left2, Вы писали:
L>Импортировать/экспортировать через __declspec надо не класс целиком, а отдельные функции этого класса (в т.ч. конструкторы, деструкторы и т.п.).
Здравствуйте, Аноним, Вы писали:
А>Как это сделать грамотно?
А>Я делаю следующим образом:
А>Взаголовке для программы-пользователя DLL сначала стандартные директивы (как и в заголовке из проекта для DLL):
А>Но при компиляции в 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 при вызове GetLogextern"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 определены
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 нет никакого полезного кода...
Аноним 617 wrote:
> Потенциальные грабли при статческой линковки рантайма: > Память нужно освобождать в том же модуле, где паиять выделена. Иначе > будут проблемы
Статически линковать CRTL, если используешь .dll вообще нельзя.
Ну т.е. можно, если хочешь гемора себе нажить.
Как только будешь использовать нереентерабельные функции CRTL
более чем из одного модуля (.exe.dll) — сразу нарвешься на неприятности.