wxWidgets, dll и динамическое добавление контролов
От: игппук Беларусь  
Дата: 01.12.07 20:35
Оценка:
приветствую знатоков библиотеки wxWidgets

работаю над следующей системой:
1. имеется ядро (exe)
2. ядро должно: нарисовать главное окно, создать таб контрол, обнаружить плагины (dll), подгрузить их к ядру, каждому плагину создать отдельную закладку, которая отдается в плагин, который с закладкой сможет сделать что угодно
3. проинициализовать плагины, обеспечить общий интерфейс

использую в своей работе библиотеку wxWidgets. в ядре главное окно и таб контрол создаются без проблем. плагины подгружаются, каждому плагину создается соответствующий объект класса wxWindows, который позднее отдается в плагин.
далее, плагин должен в полученном окне нарисовать свои собственные контролы. здесь я столкнулся с проблемой. при добавлении любого контрола в окно, например

wxPanel* panel = new wxPanel(page, wxID_ANY);


происходит затык внутри библиотеки, внутри следующего метода

void* wxHashTableBase::DoGet( long key, long hash )


аналогичный код внутри exe работает без проблем. насколько я понимаю, это связано как то с тем, что плагин и ядро работают в разных адресных пространствах, имеют разный HINSTANCE.

полагаю, что проблема известная и что должны быть рекомендации по ее устранению.
прошу помочь мне в решении данной проблемы.

спасибо.
проклятый антисутенерский закон
Re: wxWidgets, dll и динамическое добавление контролов
От: Sergey Россия  
Дата: 01.12.07 21:54
Оценка:
И>
wxPanel* panel = new wxPanel(page, wxID_ANY);


И>происходит затык внутри библиотеки, внутри следующего метода


И>
void* wxHashTableBase::DoGet( long key, long hash )


Это та хэштаблица, из которой сооветствие hwnd -> wxWindow* вытаскивается?

И>аналогичный код внутри exe работает без проблем. насколько я понимаю, это связано как то с тем, что плагин и ядро работают в разных адресных пространствах, имеют разный HINSTANCE.


Адресное пространство у них, разумеется одно. HINSTANCE, скорее всего, тоже не при чем. А вот если линковать wxWidgets статически, то могут получится 2 и более экземпляра глобальной хэштаблицы и какие-то проблемы точно будут.

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


С чем конкретно линкуете exe и плагины?
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[2]: wxWidgets, dll и динамическое добавление контролов
От: игппук Беларусь  
Дата: 01.12.07 22:37
Оценка:
Здравствуйте, Sergey, Вы писали:

И>>
void* wxHashTableBase::DoGet( long key, long hash )


S>Это та хэштаблица, из которой сооветствие hwnd -> wxWindow* вытаскивается?

похоже на то. причем объекта wxHashTableBase == null. отсюда и крэш

S>Адресное пространство у них, разумеется одно. HINSTANCE, скорее всего, тоже не при чем. А вот если линковать wxWidgets статически, то могут получится 2 и более экземпляра глобальной хэштаблицы и какие-то проблемы точно будут.


S>С чем конкретно линкуете exe и плагины?


использую Visual Studio 2005. в exe wxWidgets подгружается как lib. в плагине настройки аналогичные, то есть wxWidgets тоже как lib подгружаются. похоже, что проблема в этом.

получается следующая картина. в exe создается свой контрол, который отдается в dll. там создается свой контрол, и он добавляется в тот, который был создан в exe. и эта попытка не проходит.

вопрос в следующем. как лучше организовать проект? чтобы не создавались несколько экземпляров глобальных объектов wxWidgets? ведь я планирую в будущем делать еще несколько плагинов на основе этой библиотеки.
проклятый антисутенерский закон
Re[3]: wxWidgets, dll и динамическое добавление контролов
От: Sergey Россия  
Дата: 01.12.07 22:42
Оценка: 6 (1)
Здравствуйте, игппук, Вы писали:

S>>С чем конкретно линкуете exe и плагины?


И>использую Visual Studio 2005. в exe wxWidgets подгружается как lib. в плагине настройки аналогичные, то есть wxWidgets тоже как lib подгружаются. похоже, что проблема в этом.


И>получается следующая картина. в exe создается свой контрол, который отдается в dll. там создается свой контрол, и он добавляется в тот, который был создан в exe. и эта попытка не проходит.


И>вопрос в следующем. как лучше организовать проект? чтобы не создавались несколько экземпляров глобальных объектов wxWidgets? ведь я планирую в будущем делать еще несколько плагинов на основе этой библиотеки.


В общем, линкуйтесь с либами из /vc_dll и все будет работать нормально.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[4]: wxWidgets, dll и динамическое добавление контролов
От: игппук Беларусь  
Дата: 01.12.07 22:52
Оценка:
Здравствуйте, Sergey, Вы писали:

S>В общем, линкуйтесь с либами из /vc_dll и все будет работать нормально.


благодарю за совет
не подскажете, где их взять? у меня есть vc_lib, а vc_dll нет
проклятый антисутенерский закон
Re[5]: wxWidgets, dll и динамическое добавление контролов
От: игппук Беларусь  
Дата: 01.12.07 22:55
Оценка:
хотя... вопрос конечно глупый. поищу в тырнете. видать, что у меня не полный инсталляк.
проклятый антисутенерский закон
Re[5]: wxWidgets, dll и динамическое добавление контролов
От: d1mk4  
Дата: 02.12.07 11:23
Оценка:
Здравствуйте, игппук, Вы писали:

S>>В общем, линкуйтесь с либами из /vc_dll и все будет работать нормально.


И>благодарю за совет

И>не подскажете, где их взять? у меня есть vc_lib, а vc_dll нет

Вам нужно открыть build\msw\wx.sln и задать конфигурацию DLL Debug или DLL Release, скомпилить и появится эта папочка (vc_dll) в lib со всеми dll и lib файлами к ним.

Только теперь вам нужно будет еще тоскать везде эти либы со своим ехешником ;(
... << RSDN@Home 1.2.0 alpha rev. 735>>
Re[6]: wxWidgets, dll и динамическое добавление контролов
От: игппук Беларусь  
Дата: 02.12.07 11:55
Оценка:
Здравствуйте, d1mk4, Вы писали:

D>Вам нужно открыть build\msw\wx.sln и задать конфигурацию DLL Debug или DLL Release, скомпилить и появится эта папочка (vc_dll) в lib со всеми dll и lib файлами к ним.


D>Только теперь вам нужно будет еще тоскать везде эти либы со своим ехешником ;(


таскать — это не проблема. собсна, сидел до 4ех ночи, компилил библиотеку в нескольких конфигурациях (уникод, дебаг, релиз и все такое). а вообще то я больше предпочитаю таскать dll, чем запихивать ее вовнутрь exe.

cпасибо за советы, проблема устранена.
проклятый антисутенерский закон
Re: wxWidgets, dll и динамическое добавление контролов
От: игппук Беларусь  
Дата: 27.12.07 23:06
Оценка:
прошу помощи у знатоков разобраться с контролом wxRichTextCtrl

именно, интересует возможность добавления в него картинок. происходит это следующим образом

void MainFrame::PrintSmile(wxBitmap _bitmap, wxString _text)
{
    wxImage image = _bitmap.ConvertToImage();

    richTetxtCtrl_->SetFocus();
    richTetxtCtrl_->AddImage(image);
}


сам ричэдит был создан так

richTetxtCtrl_ = new wxRichTextCtrl(textenterPanel_,
                                        wxID_ANY,
                                        wxEmptyString,
                                        wxDefaultPosition,
                                        wxSize(messageSize.x, dy / 2 - 60),
                                        wxVSCROLL | wxHSCROLL | wxNO_BORDER | wxWANTS_CHARS);


картинка рисуется, но есть следующие моменты, которые портят картинку

1. сама картинка отображается не сразу, а только тогда, когда я начинаю что-нибудь писать в рич-эдит.
2. картинка почему то всегда рисуется с новой строчки. а мне надо, чтобы она рисовалась с текущей позиции.

спасибо.
проклятый антисутенерский закон
Re[2]: wxWidgets, dll и динамическое добавление контролов
От: Тюшков Николай Владимирович Россия http://softvoile.com/
Дата: 18.01.08 19:14
Оценка:
Здравствуйте, игппук, Вы писали:

И>1. сама картинка отображается не сразу, а только тогда, когда я начинаю что-нибудь писать в рич-эдит.

Попробывать принудительно обновить ричэдит после добавления картинки?

И>2. картинка почему то всегда рисуется с новой строчки. а мне надо, чтобы она рисовалась с текущей позиции.


wxRichTextCtrl roadmap читали в хелпе? там есть в числе прочего "Floating images, with content wrapping around them". Так что боюсь с текущей позиции никак.

А вообще wxRichTextCtrl имхо не самая стабильная штука в wx
Блог шароварщика
Микроблог про wxWidgets
--
Блог шароварщика ::Микроблог про wxWidgets
Re[3]: wxWidgets, dll и динамическое добавление контролов
От: игппук Беларусь  
Дата: 19.01.08 16:30
Оценка:
Здравствуйте, Тюшков Николай Владимирович, Вы писали:

ТНВ>wxRichTextCtrl roadmap читали в хелпе? там есть в числе прочего "Floating images, with content wrapping around them". Так что боюсь с текущей позиции никак.


ТНВ>А вообще wxRichTextCtrl имхо не самая стабильная штука в wx


проблема решена. рефрэши не помогают, кстати.
еще раз почитав функции этого контрола я нашел функцию WriteImage. вот она и решила мои проблемы.
проклятый антисутенерский закон
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.