Проблема с MFC классом в DLL
От: NickolasCPP Россия  
Дата: 26.09.07 13:23
Оценка:
Как видно из темы я создал класс и решил его поместить в DLL, но вот проблема компилятор выдает ошибку т.к. обнаруживает в атрибутах класса статические переменные и функции. Как избавиться от ошибки более безболезненным путем?? Тобишь не убирать из класса статические функции и переменные??
Re: Проблема с MFC классом в DLL
От: Erop Россия  
Дата: 26.09.07 13:48
Оценка:
Здравствуйте, NickolasCPP, Вы писали:

NCP>Как видно из темы я создал класс и решил его поместить в DLL, но вот проблема компилятор выдает ошибку т.к. обнаруживает в атрибутах класса статические переменные и функции. Как избавиться от ошибки более безболезненным путем?? Тобишь не убирать из класса статические функции и переменные??


Расставить в нужных местах
__declspce(dllexport) и __declspce(dllimport)
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[2]: Проблема с MFC классом в DLL
От: NickolasCPP Россия  
Дата: 26.09.07 14:02
Оценка:
Здравствуйте, 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;
...
}
Re: Проблема с MFC классом в DLL
От: den123 Израиль http://den123.smugmug.com
Дата: 26.09.07 15:42
Оценка:
Здравствуйте, NickolasCPP, Вы писали:

NCP>Как видно из темы я создал класс и решил его поместить в DLL, но вот проблема компилятор выдает ошибку т.к. обнаруживает в атрибутах класса статические переменные и функции. Как избавиться от ошибки более безболезненным путем?? Тобишь не убирать из класса статические функции и переменные??


Думаю, что никак Статические и в ДЛЛ — не получится по определению. Можно всякими окольными путями...
WBR — Yuriy
Re[2]: Проблема с MFC классом в DLL
От: NickolasCPP Россия  
Дата: 26.09.07 15:53
Оценка:
Здравствуйте, den123, Вы писали:

D>Думаю, что никак Статические и в ДЛЛ — не получится по определению. Можно всякими окольными путями...


Нет ну как-то точно можно, неужели крутые программеры не смогли придумать чего-нибудь умного?!?
Вот сдесь он пишет что у него получилось, но у меня что-то не выходит
http://www.rsdn.ru/Forum/?mid=6712
Автор: sanyvaa
Дата: 19.09.01

У меня-то и работает, но только если класс не экспортируемый , а как ставлю сразу пишет ошибку

Причем есть в экспортируемом классе атрибут:
static CTypedPtrArray<CPtrArray, HMENU>  m_AllSubMenus;

с которым экспортируется нормаль, а при добавлении
    static UINT original_drawmode, xp_drawmode;
    static BOOL xp_select_disabled,original_select_disabled;

что-то не хочет может проблема в типе UINT и BOOL. Ну типа виндовые или ещё что?
Re[3]: Проблема с MFC классом в DLL
От: Шебеко Евгений  
Дата: 26.09.07 17:06
Оценка:
Николай, почитайте про общую технику экспорта классов в dll.
Это общая техника, касается вообще всех классов, а не отдельно MFC
Классы чудестно экспортятся из длл вместе со статическими функциями и переменными.
Для этого достаточно указать на экспорт непосредственно по слова class.
Фокус в том, что в вашей DLL определение класса должно выглядеть так:

class __declspec(dllexport) BCMenu : public CMenu
{
...
};


а в том проекте, где эта длл используется:
class __declspec(dllimport) BCMenu : public CMenu
{
...
};


Разруливается это макросом.
Я не думаю что использование AFX_EXT_CLASS в вашей длл хорошая идея.

Моей велосипед выглядит примерно так:
//gismfc_export.h
#ifndef gismfc_gismfc_exportH
#define gismfc_gismfc_exportH

#ifdef GISMFC_USE_LIB
# define GISMFC_EXPORT
#else
# ifdef GISMFC_EXPORTING
#   define GISMFC_EXPORT _declspeс(dllexport)
# else
#   define GISMFC_EXPORT _declspeс(dllimport)
# endif
#endif

#endif


GISMFC_EXPORTING определяете в дефайнах в проекте вашей dll (С/C++ ->Preprocessor -> Preprocessor Definitions). В каждом проекте определяете свой макрос и его используете.
Только так можно нормально поддерживать большой проект с несколькими длл.

Ваш класс выглядел бы примерно так:

class GISMFC_EXPORT BCMenu : public CMenu
{
...
};
Re[4]: Проблема с MFC классом в DLL
От: NickolasCPP Россия  
Дата: 26.09.07 18:15
Оценка:
Здравствуйте, Шебеко Евгений, сделал как вы сказади и так как http://www.rsdn.ru/article/baseserv/dlluse.xml
Автор(ы):
Александр Шаргин


В статье рассматривается три способа подключения DLL к программе на Visual C++ — неявное подключение (implicit linking), явное подключение (explicit linking) и отложенная загрузка (delayed load) DLL. Для каждого способа демонстрируется использование переменной, функции и класса из подключаемой DLL. В разделе об отложенной загрузке также приводится дополнительная информация (описание обработки исключений и использования функций-ловушек).
— сдеся, где явно видно использование статических классов, и все компилится, но при добавление именно статических полей UINT и BOOL глюк может нельзя делать виндовые типы статическими?
Re[5]: Проблема с MFC классом в DLL
От: NickolasCPP Россия  
Дата: 26.09.07 18:40
Оценка:
Такого ламерства я ещё не встречал оказалось он ворчит на то что я переменные вот так написал:
static UINT original_drawmode, xp_drawmode;
а вот так работает
static UINT original_drawmode;
static UINT xp_drawmode;
Re[6]: шишки на ровном месте :(
От: Erop Россия  
Дата: 26.09.07 18:54
Оценка:
Здравствуйте, NickolasCPP, Вы писали:

NCP> static UINT original_drawmode;

NCP> static UINT xp_drawmode;

1) Используй тэги [с][/с]

2) У меня были таки смутные подозрения, что __declspec(...) действует не на все переменные в определении.

3) Это ещ раз учит нас тому, что самые умные и красивые, которые изобретают новые пути там, где все ходят старыми набивают шишки там, где остальные прошли свободно
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[3]: Проблема с MFC классом в DLL
От: ajanov  
Дата: 27.09.07 09:29
Оценка:
Здравствуйте, NickolasCPP, Вы писали:

NCP>Здравствуйте, den123, Вы писали:


NCP>Причем есть в экспортируемом классе атрибут:

NCP>
NCP>static CTypedPtrArray<CPtrArray, HMENU>  m_AllSubMenus;
NCP>

NCP>с которым экспортируется нормаль, а при добавлении
NCP>
NCP>    static UINT original_drawmode, xp_drawmode;
NCP>    static BOOL xp_select_disabled,original_select_disabled;
NCP>

NCP>что-то не хочет может проблема в типе UINT и BOOL. Ну типа виндовые или ещё что?

Вы хотябы напишите какие сообщения компилятор выдает. Типы не причем.
P.S. У меня все работает (VC++2005)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.