Здравствуйте, игппук, Вы писали:
S>>С чем конкретно линкуете exe и плагины?
И>использую Visual Studio 2005. в exe wxWidgets подгружается как lib. в плагине настройки аналогичные, то есть wxWidgets тоже как lib подгружаются. похоже, что проблема в этом.
И>получается следующая картина. в exe создается свой контрол, который отдается в dll. там создается свой контрол, и он добавляется в тот, который был создан в exe. и эта попытка не проходит.
И>вопрос в следующем. как лучше организовать проект? чтобы не создавались несколько экземпляров глобальных объектов wxWidgets? ведь я планирую в будущем делать еще несколько плагинов на основе этой библиотеки.
В общем, линкуйтесь с либами из /vc_dll и все будет работать нормально.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
wxWidgets, dll и динамическое добавление контролов
работаю над следующей системой:
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 и динамическое добавление контролов
И>происходит затык внутри библиотеки, внутри следующего метода
И>
void* wxHashTableBase::DoGet( long key, long hash )
Это та хэштаблица, из которой сооветствие hwnd -> wxWindow* вытаскивается?
И>аналогичный код внутри exe работает без проблем. насколько я понимаю, это связано как то с тем, что плагин и ядро работают в разных адресных пространствах, имеют разный HINSTANCE.
Адресное пространство у них, разумеется одно. HINSTANCE, скорее всего, тоже не при чем. А вот если линковать wxWidgets статически, то могут получится 2 и более экземпляра глобальной хэштаблицы и какие-то проблемы точно будут.
И>полагаю, что проблема известная и что должны быть рекомендации по ее устранению.
С чем конкретно линкуете exe и плагины?
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[2]: wxWidgets, dll и динамическое добавление контролов
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[4]: wxWidgets, dll и динамическое добавление контролов
Здравствуйте, игппук, Вы писали:
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 и динамическое добавление контролов
Здравствуйте, d1mk4, Вы писали:
D>Вам нужно открыть build\msw\wx.sln и задать конфигурацию DLL Debug или DLL Release, скомпилить и появится эта папочка (vc_dll) в lib со всеми dll и lib файлами к ним.
D>Только теперь вам нужно будет еще тоскать везде эти либы со своим ехешником ;(
таскать — это не проблема. собсна, сидел до 4ех ночи, компилил библиотеку в нескольких конфигурациях (уникод, дебаг, релиз и все такое). а вообще то я больше предпочитаю таскать dll, чем запихивать ее вовнутрь exe.
cпасибо за советы, проблема устранена.
проклятый антисутенерский закон
Re: wxWidgets, dll и динамическое добавление контролов
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 и динамическое добавление контролов
Здравствуйте, игппук, Вы писали:
И>1. сама картинка отображается не сразу, а только тогда, когда я начинаю что-нибудь писать в рич-эдит.
Попробывать принудительно обновить ричэдит после добавления картинки?
И>2. картинка почему то всегда рисуется с новой строчки. а мне надо, чтобы она рисовалась с текущей позиции.
wxRichTextCtrl roadmap читали в хелпе? там есть в числе прочего "Floating images, with content wrapping around them". Так что боюсь с текущей позиции никак.
А вообще wxRichTextCtrl имхо не самая стабильная штука в wx
Здравствуйте, Тюшков Николай Владимирович, Вы писали:
ТНВ>wxRichTextCtrl roadmap читали в хелпе? там есть в числе прочего "Floating images, with content wrapping around them". Так что боюсь с текущей позиции никак.
ТНВ>А вообще wxRichTextCtrl имхо не самая стабильная штука в wx
проблема решена. рефрэши не помогают, кстати.
еще раз почитав функции этого контрола я нашел функцию WriteImage. вот она и решила мои проблемы.