Всем добрый день.
Обращаюсь к знатокам библиотеки wxWidgets. У меня следующая проблема: я пишу программу с framework-ом, то есть хочу, чтобы внешним видом и набором интерфейсных модулей проги управлять из вне с помощью скрипта. В том числе я хочу реализовать возможность подключения новых интерфейсных модулей черед DLL. И ведущая программа, и подключаемые модули используют wxWidgets. А теперь собственно проблема: при попытке использовать функции wxWidgets из DLL программа падает при вызове импортированной функции. Насколько я понимаю, проблема в том, что wxWidgets не инициализируется из DLL. Надеюсь на помощь в решении этой проблемы.
Прогу пишу wxDevCpp. При попытке работы в VS появилась следущая проблема: не получилось подключить wxWidgets к DLL (на сколько я понимаю, тут, в отличие от dev-cpp, дело не ограничивается прописанием путей к библиотекам, а вот что еще надо сделать, я никак не могу понять. Много чего пробовал — не помогает.
Вопросы:
1. Как заставить wxWidgets работать из DLL? (чтобы работали вызовы импортированных функций, содержащие вызовы функций и классов WX)
2. Как можно подключить wxWidgets в DLL под Visual Studio, чтобы компилировалось?
wxWidject поставляется в исходниках. поэтому, первый шаг, который требуется сделать — это откомпиллировать эти исходники. проект для студии лежит в следующей папке
\wxWidgets-2.8.7\build\msw\ (разумеется, для винды).
перед компилляцией исходников нужно выбрать режим компилляции (релиз, дебаг, либина, длл). если вам нужно откомпиллировать исходники как debug dll, то следует выбрать следующий режим
Dll Unicode Debug
в компилляции есть одна хитрость. если попытаться просто откомпиллировать солюшион, то компилляция обломается, если мне не изменяет мой склероз, на проекте dbgrid. поэтому, лучше поступить следующим образом:
1. выбирать ручками (мышкой) отдельно каждый проект и компилять его отдельно (а не солюшион)
2. если компиляция проекта не удалась (dbgrid, odbc, qa), то временно пропускаем эти проекты. они привязаны к другим проектам и не могут быть откомпиллированы без нужных dll (или lib).
3. компиллируем все возможные проекты (первый проход)
4. компиллируем проекты, которые ранее не удалось откомпиллить. теперь нужные dll имеются и пропущенные проекты должны откомпиллироваться нормально
в результате компилляции исходников имеем следующую папку, и в ней будут лежать откомпиллированные dll.
wxWidgets-2.8.7\lib\vc_dll\
далее. создаем свой проект и хотим прикрутить к нему wxWidject. сложность в том, что, в зависимости от режима компилляции (дебаг, релиз) требуется разная настройка параметров проекта.
допустим, что мы хотим собрать свой проект как debug. в таком случае нам потребуется прописать некоторые настройки.
настройки самой студии:
1. VC++ Directories Include files: wxWidgets-2.8.7\include\msvc + \wxWidgets-2.8.7\include
2. VC++ Directories Libraries files: wxWidgets-2.8.7\lib\vc_dll + wxWidgets-2.8.7\lib
пути я привел свои, вы припишите свои (зависят от версии wxWidject)
по моему, ничего не пропустил. при таких настройках проект свободно работает с wxWidject как с dll и никаких проблем не наблюдается. для проверки простой код
#pragma once
#include "wx/wx.h"class App : public wxApp
{
public:
App();
~App();
virtual bool OnInit();
virtual int OnExit();
};
Здравствуйте, игппук, Вы писали:
И>wxWidject поставляется в исходниках. поэтому, первый шаг, который требуется сделать — это откомпиллировать эти исходники. проект для студии лежит в следующей папке
И>\wxWidgets-2.8.7\build\msw\ (разумеется, для винды).
Спасибо большое за совет, он оказаолся довольно полезным, но проблема немного не в этом. Проблема в том, что при попытке вызвать wx-функцию из DLL программа падает, очевидно, в DLL wxWidgets как-то криво инициализируются.
Нашел пример с работой wx из под dll — http://www.wxwidgets.org/wiki/index.php/Creating_A_DLL_Of_An_Application
Но скомпилировать его так и не удалось.
Вот мои действия: вначале я для примера с DLL прописываю все пути (для режима Debug, или DLL Unicode Debug, из вашего примера), и компилирую. При попытке откомпилировать примерчик линкер говорит, что не может найти некоторые библиотеки. Эти библиотеки прописаны в AdditionalDependencies файла *.vcproj проекта этого примеора и соответствуют некоторой старой версии WX). В новой версии я их аналогов не нашел, и удалил их из строки зависимостей. После этого компиляция прошла немного дальше, но наткнулась на КУЧУ неопределенных функций. Видно, что библиотеки *.lib так и не были найдены.
При этом вторая часть примера, где DLL импортируется, отлично компилируется и запускается.
При попытке сделать тоже самое с чистым DLL-проектом, сгенерированном по умолчанию, только заменив код в Main и дописав все пути и параметры, получается аналогичная ситуация. Пробовал и другие режимы, помимо просто DEBUG (mswd). Не момогает.
Для не DLL проекта, который, также использует функции wxWidgets, действуя по вашей инструкции все отлично компилируется и запускается.
Не могли бы вы мне подсказать, что я делаю неправильно и как откомпилировать DLL-часть этого примера?
PS В Dev-Cpp при попытке запустить пример возникает проблема, что программа падает при вызове wx-функции из DLL.
я посмотрел тот проект. вот к какому выводу пришел:
1. проект заточен для работы с wxWidject меньшей версии (или другой), поэтому имена lib файлов не совпадают (в некоторых случаях надо вначале просто добавить префикс wx, в некоторых надо искать аналог lib файлов.
2. сам проект содержит ошибки как в настройках, так и в коде (в коде не ошибки, а другая версия библиотеки). ошибки в настройкаъ заключаются в том, что C/C++ General Additional Include Directories — пустой.
я пытался разобраться в этом проекте, но потом тоже закопался в поике нужных lib и отказался от этой идеи. но ведь lib нам и не нужны, не так ли? мы же использует dll, а не lib. поэтому из этого я делаю вывод, что проект вам не подходит, так как целью стоит использование dll версии библиотеки.
поэтому:
1. выкиньте этот промер
2. сделайте свой dll проект и настройте его точно так же, как настраивали exe (по рекомендациям выше)
и все должно заработать. wxWidject все равно, откуда ее вызывают, будь то exe или dll.
у меня был рабочий dll проект, откомпиллированный как release версия, которая использовала wxWidjects как dll библиотеку и все работало. тока найти я его сейчас не могу.
зы. в dll вовсе не обязательно использовать wxEntry. он нужен только в том случае, если ваш класс аппликации унаследован от wxApp.
JB>Для не DLL проекта, который, также использует функции wxWidgets, действуя по вашей инструкции все отлично компилируется и запускается. JB>Не могли бы вы мне подсказать, что я делаю неправильно и как откомпилировать DLL-часть этого примера?
забейте на пример, он не для вашего случая, а используйте мои инструкции для dll проекта, и все будет работать.