Проблема с DLL Topic is solved

Это русская секция форума wxWidjets. В этой секции вы можете обсуждать любые вопросы, связанные с wxWidgets на вашем родном языке.
Post Reply
ONEEYEMAN
Part Of The Furniture
Part Of The Furniture
Posts: 3905
Joined: Sat Apr 16, 2005 7:22 am
Location: USA, Ukraine

Проблема с DLL

Post by ONEEYEMAN » Mon Sep 08, 2008 5:40 am

Доброго времени суток,
Кто нибудь писал DLL с исподбзованием wx?
Написал библиотеку DLL, которая экспортирует класс. В параметрах компилятора проставил что она _USRDLL, т.е. линкуется статически.

Проэкт с библиотекой и основным приложением компилируется нормально, а при запуске висит.
Отладчик VC показывает что в качестве основного выбран объект wxApp из библиотеки.
Помимо всего прочего еще и сообщения выскакивают:

10:22:34 PM: C:\wxWidgets.54790\src\msw\app.cpp(674): 'RegisterClass([email protected])' failed with error 0x00000582 (class already exists.).
10:22:34 PM: C:\wxWidgets.54790\src\msw\app.cpp(674): 'RegisterClass([email protected])' failed with error 0x00000582 (class already exists.).
10:22:34 PM: Adding duplicate image handler for 'Windows bitmap file'
The program 'F:\projects\AppBuilder\src\vc_mswuddll\docview.exe' has exited with code 0 (0x0).

Кто знает что делать?

WinXP/VC++6/wx TRUNK DLL debug build.

Заранее спасибо.

tan
Moderator
Moderator
Posts: 1471
Joined: Tue Nov 14, 2006 7:58 am
Location: Saint-Petersburg, Russia

Re: Проблема с DLL

Post by tan » Mon Sep 08, 2008 9:28 am

Привет.
ONEEYEMAN wrote:Доброго времени суток,
Кто нибудь писал DLL с исподбзованием wx?
Ну а как же, только этим и занимаюсь :)
ONEEYEMAN wrote: Написал библиотеку DLL, которая экспортирует класс. В параметрах компилятора проставил что она _USRDLL, т.е. линкуется статически.
Тут не понял, в каких параметрах? Да и вообще нет никакой реальной разницы (с точки зрения DLL), динамически она линкуется или статически.
ONEEYEMAN wrote: Проэкт с библиотекой и основным приложением компилируется нормально, а при запуске висит.
Отладчик VC показывает что в качестве основного выбран объект wxApp из библиотеки.
Помимо всего прочего еще и сообщения выскакивают:

10:22:34 PM: C:\wxWidgets.54790\src\msw\app.cpp(674): 'RegisterClass([email protected])' failed with error 0x00000582 (class already exists.).
10:22:34 PM: C:\wxWidgets.54790\src\msw\app.cpp(674): 'RegisterClass([email protected])' failed with error 0x00000582 (class already exists.).
10:22:34 PM: Adding duplicate image handler for 'Windows bitmap file'
The program 'F:\projects\AppBuilder\src\vc_mswuddll\docview.exe' has exited with code 0 (0x0).

Кто знает что делать?
Ну, во-первых, что бы точно сказать надо бы код этой DLL посмотреть. А, во-вторых, судя по всему, не надо просто лишний раз инициализировать библиотеку в этой DLL, ну и всяких IMPLEMENT_APP_NO_MAIN() там юзать.
OS: Windows XP Pro
Compiler: MSVC++ 7.1
wxWidgets: 2.8.10

ONEEYEMAN
Part Of The Furniture
Part Of The Furniture
Posts: 3905
Joined: Sat Apr 16, 2005 7:22 am
Location: USA, Ukraine

Re: Проблема с DLL

Post by ONEEYEMAN » Mon Sep 08, 2008 5:47 pm

tan wrote: Привет.
ONEEYEMAN wrote: Доброго времени суток,
Кто нибудь писал DLL с исподбзованием wx?
Ну а как же, только этим и занимаюсь :)
Ponjatno. To est prilogenij ne pishem tolko biblioteki... :)
tan wrote:
ONEEYEMAN wrote: Написал библиотеку DLL, которая экспортирует класс. В параметрах компилятора проставил что она _USRDLL, т.е. линкуется статически.
Тут не понял, в каких параметрах? Да и вообще нет никакой реальной разницы (с точки зрения DLL), динамически она линкуется или статически.
Zato est s tochki zrenija prilogenija...
tan wrote:
ONEEYEMAN wrote: Проэкт с библиотекой и основным приложением компилируется нормально, а при запуске висит.
Отладчик VC показывает что в качестве основного выбран объект wxApp из библиотеки.
Помимо всего прочего еще и сообщения выскакивают:

10:22:34 PM: C:\wxWidgets.54790\src\msw\app.cpp(674): 'RegisterClass([email protected])' failed with error 0x00000582 (class already exists.).
10:22:34 PM: C:\wxWidgets.54790\src\msw\app.cpp(674): 'RegisterClass([email protected])' failed with error 0x00000582 (class already exists.).
10:22:34 PM: Adding duplicate image handler for 'Windows bitmap file'
The program 'F:\projects\AppBuilder\src\vc_mswuddll\docview.exe' has exited with code 0 (0x0).

Кто знает что делать?
Ну, во-первых, что бы точно сказать надо бы код этой DLL посмотреть. А, во-вторых, судя по всему, не надо просто лишний раз инициализировать библиотеку в этой DLL, ну и всяких IMPLEMENT_APP_NO_MAIN() там юзать.

Code: Select all

IMPLEMENT_APP_NO_MAIN(CLibraryApp)

#ifdef __WXMSW__
bool DllMain(...)
{
      switch( fReason)
      {
           case DLL_PROCESS_ATTACH:
               wxInitialize();
               break;
           case DLL_PROCESS_DETACH:
               wxUninitialize();
               break;
      }
      return true;
}
#endif

bool CLibraryApp::OnInit()
{
     return true;
}
V Linux'e (Gentoo) vse rabotaet kak chasy, a M$ otkazyvaetsja...

tan
Moderator
Moderator
Posts: 1471
Joined: Tue Nov 14, 2006 7:58 am
Location: Saint-Petersburg, Russia

Post by tan » Mon Sep 08, 2008 6:16 pm

А без DllMain не пробовал?
Да, а главное приложение само wx юзает?
OS: Windows XP Pro
Compiler: MSVC++ 7.1
wxWidgets: 2.8.10

ONEEYEMAN
Part Of The Furniture
Part Of The Furniture
Posts: 3905
Joined: Sat Apr 16, 2005 7:22 am
Location: USA, Ukraine

Post by ONEEYEMAN » Mon Sep 08, 2008 7:01 pm

Naskolko ja znaju, pod MS vse DLL dolgny imet funkciju DllMain().
Eto t.n. tochka vhoda v biblioteku...

[EDIT]
Sorry, sovsem zabyl.
Prilogenie toge napisano pod wx. Vse ispolzuet wx kak DLL Debug.
[/EDIT]

tan
Moderator
Moderator
Posts: 1471
Joined: Tue Nov 14, 2006 7:58 am
Location: Saint-Petersburg, Russia

Post by tan » Tue Sep 09, 2008 4:21 am

ONEEYEMAN wrote:Naskolko ja znaju, pod MS vse DLL dolgny imet funkciju DllMain().
Eto t.n. tochka vhoda v biblioteku...
Нет, не так. DllMain (или другая, указанная линкеру функция) будет вызвана, если она существует в DLL при ее загрузке. Она может быть использована для выполнения определенных действий, например для инициализации переменных и т.д. Если ее нет, то и фиг с ней :)
ONEEYEMAN wrote: [EDIT]
Sorry, sovsem zabyl.
Prilogenie toge napisano pod wx. Vse ispolzuet wx kak DLL Debug.
[/EDIT]
Если главное приложение само использует WX и библиотеки WX собраны как DLL, то нет никакого смыслв (т.е. даже вредно) инициализировать WX при загрузке внешней DLL, поскольку и главное приложение и эта DLL используют один и тот же экземпляр WX DLL и он уже инициализован в главном приложении. Я об этом уже неоднократно писал здесь на форуме.
OS: Windows XP Pro
Compiler: MSVC++ 7.1
wxWidgets: 2.8.10

ONEEYEMAN
Part Of The Furniture
Part Of The Furniture
Posts: 3905
Joined: Sat Apr 16, 2005 7:22 am
Location: USA, Ukraine

Post by ONEEYEMAN » Tue Sep 09, 2008 5:03 am

tan,
Тут проблема вот еще в чем.
В моем приложении 2 вида DLL: динамическая библиотека и статическая библиотека.
Поэтому чтобы удовлетворить запросы первой использую DLL-build wx'а.

Что касается DllMain(), то здесь я совсем ничего не понимаю. Вроде как все говорят что она должна быть...

Но я попробую без нее и без создания объекта приложения...

[EDIT]
P.S.: Только что прочекал MSDN. Признаю - был в корне неправ.
[/EDIT]

ONEEYEMAN
Part Of The Furniture
Part Of The Furniture
Posts: 3905
Joined: Sat Apr 16, 2005 7:22 am
Location: USA, Ukraine

Post by ONEEYEMAN » Tue Sep 09, 2008 5:49 am

Ура!!!!! Заработало!!!!!! (C) Кот Матроскин.

Большое спасибо.

P.S.: Кстати прошу прощения за помесь клавиатур. На работе только английский язык, т.к. живу в USA, а дома поставил русский язык. :)

User avatar
T-Rex
Moderator
Moderator
Posts: 1190
Joined: Sat Oct 23, 2004 9:58 am
Location: Zaporizhzhya, Ukraine
Contact:

Post by T-Rex » Tue Sep 09, 2008 8:30 am

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

ONEEYEMAN
Part Of The Furniture
Part Of The Furniture
Posts: 3905
Joined: Sat Apr 16, 2005 7:22 am
Location: USA, Ukraine

Post by ONEEYEMAN » Fri Sep 12, 2008 8:48 pm

T-Rex,
Nikakogo koda net.
Prosto kogda sozdaesh staticheski komponuemuju biblioteku nugno iskluchit DllMain/IMPLEMENT_APP_NO_MAIN is modulja inicializacii. I vse budet rabotat.

Hotelos by esche proverit budet li ono rabotat esli linkovat wx dinamicheski, no eto uge drugaja istorija...

Post Reply