Как видно из темы я создал класс и решил его поместить в DLL, но вот проблема компилятор выдает ошибку т.к. обнаруживает в атрибутах класса статические переменные и функции. Как избавиться от ошибки более безболезненным путем?? Тобишь не убирать из класса статические функции и переменные??
Здравствуйте, NickolasCPP, Вы писали:
NCP>Как видно из темы я создал класс и решил его поместить в DLL, но вот проблема компилятор выдает ошибку т.к. обнаруживает в атрибутах класса статические переменные и функции. Как избавиться от ошибки более безболезненным путем?? Тобишь не убирать из класса статические функции и переменные??
Расставить в нужных местах
__declspce(dllexport) и __declspce(dllimport)
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>Расставить в нужных местах E>
__declspce(dllexport) и __declspce(dllimport)
Что-то неполучается все равно таже ошибка
Error 1 error C2487: 'original_drawmode' : member of dll interface class may not be declared with dll interface d:\project\myproject\new\common\bcmenu.h 253
Вот что я пробую
class AFX_EXT_CLASS BCMenu : public CMenu
{
....
public:
__declspec(dllexport) static UINT original_drawmode, xp_drawmode;
__declspec(dllexport) static BOOL xp_select_disabled,original_select_disabled;
...
}
Здравствуйте, NickolasCPP, Вы писали:
NCP>Как видно из темы я создал класс и решил его поместить в DLL, но вот проблема компилятор выдает ошибку т.к. обнаруживает в атрибутах класса статические переменные и функции. Как избавиться от ошибки более безболезненным путем?? Тобишь не убирать из класса статические функции и переменные??
Думаю, что никак Статические и в ДЛЛ — не получится по определению. Можно всякими окольными путями...
Здравствуйте, den123, Вы писали:
D>Думаю, что никак Статические и в ДЛЛ — не получится по определению. Можно всякими окольными путями...
Нет ну как-то точно можно, неужели крутые программеры не смогли придумать чего-нибудь умного?!?
Вот сдесь он пишет что у него получилось, но у меня что-то не выходит http://www.rsdn.ru/Forum/?mid=6712
Николай, почитайте про общую технику экспорта классов в dll.
Это общая техника, касается вообще всех классов, а не отдельно MFC
Классы чудестно экспортятся из длл вместе со статическими функциями и переменными.
Для этого достаточно указать на экспорт непосредственно по слова class.
Фокус в том, что в вашей DLL определение класса должно выглядеть так:
class __declspec(dllexport) BCMenu : public CMenu
{
...
};
а в том проекте, где эта длл используется:
class __declspec(dllimport) BCMenu : public CMenu
{
...
};
Разруливается это макросом.
Я не думаю что использование AFX_EXT_CLASS в вашей длл хорошая идея.
GISMFC_EXPORTING определяете в дефайнах в проекте вашей dll (С/C++ ->Preprocessor -> Preprocessor Definitions). В каждом проекте определяете свой макрос и его используете.
Только так можно нормально поддерживать большой проект с несколькими длл.
Ваш класс выглядел бы примерно так:
class GISMFC_EXPORT BCMenu : public CMenu
{
...
};
— сдеся, где явно видно использование статических классов, и все компилится, но при добавление именно статических полей UINT и BOOL глюк может нельзя делать виндовые типы статическими?
Такого ламерства я ещё не встречал оказалось он ворчит на то что я переменные вот так написал:
static UINT original_drawmode, xp_drawmode;
а вот так работает
static UINT original_drawmode;
static UINT xp_drawmode;
2) У меня были таки смутные подозрения, что __declspec(...) действует не на все переменные в определении.
3) Это ещ раз учит нас тому, что самые умные и красивые, которые изобретают новые пути там, где все ходят старыми набивают шишки там, где остальные прошли свободно
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском