Вопросы по использованию wxWidgets из DLL
От: JBear  
Дата: 20.03.08 14:49
Оценка:
Всем добрый день.
Обращаюсь к знатокам библиотеки wxWidgets. У меня следующая проблема: я пишу программу с framework-ом, то есть хочу, чтобы внешним видом и набором интерфейсных модулей проги управлять из вне с помощью скрипта. В том числе я хочу реализовать возможность подключения новых интерфейсных модулей черед DLL. И ведущая программа, и подключаемые модули используют wxWidgets. А теперь собственно проблема: при попытке использовать функции wxWidgets из DLL программа падает при вызове импортированной функции. Насколько я понимаю, проблема в том, что wxWidgets не инициализируется из DLL. Надеюсь на помощь в решении этой проблемы.
Прогу пишу wxDevCpp. При попытке работы в VS появилась следущая проблема: не получилось подключить wxWidgets к DLL (на сколько я понимаю, тут, в отличие от dev-cpp, дело не ограничивается прописанием путей к библиотекам, а вот что еще надо сделать, я никак не могу понять. Много чего пробовал — не помогает.
Вопросы:
1. Как заставить wxWidgets работать из DLL? (чтобы работали вызовы импортированных функций, содержащие вызовы функций и классов WX)
2. Как можно подключить wxWidgets в DLL под Visual Studio, чтобы компилировалось?
Re: Вопросы по использованию wxWidgets из DLL
От: игппук Беларусь  
Дата: 20.03.08 17:07
Оценка:
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. C/C++ Additional Include Directories: vc_dll/mswud;include;.;vc_dll/mswud/wx;msvc
2. C/C++ Optimization: Disabled
3. C/C++ Preprocessor: WIN32;_DEBUG;_WINDOWS;__WXMSW__;WXUSINGDLL;$(NOINHERIT)

настройки самой студии:
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();
};



#include "StdAfx.h"
#include "App.h"

IMPLEMENT_APP(App)

//----------------------------------------------------------------------------- 
// Name        : App
// Parameters  : 
// Return      : 
// Description : Constructor
//----------------------------------------------------------------------------- 
App::App()
{
}

//----------------------------------------------------------------------------- 
// Name        : ~App
// Parameters  : 
// Return      : 
// Description : Destructor
//----------------------------------------------------------------------------- 
App::~App()
{
}

//----------------------------------------------------------------------------- 
// Name        : OnInit
// Parameters  : 
// Return      : 
// Description : 
//----------------------------------------------------------------------------- 
bool App::OnInit()
{
    return true;
}

//----------------------------------------------------------------------------- 
// Name        : OnExit
// Parameters  : 
// Return      : 
// Description : 
//----------------------------------------------------------------------------- 
int App::OnExit()
{
    return 0;
}
проклятый антисутенерский закон
Re[2]: Вопросы по использованию wxWidgets из DLL
От: игппук Беларусь  
Дата: 20.03.08 17:09
Оценка:
Здравствуйте, игппук, Вы писали:

И>wxWidject поставляется в исходниках. поэтому, первый шаг, который требуется сделать — это откомпиллировать эти исходники. проект для студии лежит в следующей папке


И>\wxWidgets-2.8.7\build\msw\ (разумеется, для винды).


забыл указать, что имя проекта wx_dll.dsw
проклятый антисутенерский закон
Re[2]: Вопросы по использованию wxWidgets из DLL
От: JBear  
Дата: 27.03.08 11:49
Оценка:
Спасибо большое за совет, он оказаолся довольно полезным, но проблема немного не в этом. Проблема в том, что при попытке вызвать 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.
Re[3]: Вопросы по использованию wxWidgets из DLL
От: игппук Беларусь  
Дата: 27.03.08 16:09
Оценка:
Здравствуйте, JBear, Вы писали:

я посмотрел тот проект. вот к какому выводу пришел:
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 проекта, и все будет работать.
проклятый антисутенерский закон
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.