Page 1 of 1

Проблема с DLL

Posted: Mon Sep 08, 2008 5:40 am
by ONEEYEMAN
Доброго времени суток,
Кто нибудь писал 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.

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

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

Posted: Mon Sep 08, 2008 9:28 am
by tan
Привет.
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() там юзать.

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

Posted: Mon Sep 08, 2008 5:47 pm
by ONEEYEMAN
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...

Posted: Mon Sep 08, 2008 6:16 pm
by tan
А без DllMain не пробовал?
Да, а главное приложение само wx юзает?

Posted: Mon Sep 08, 2008 7:01 pm
by ONEEYEMAN
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]

Posted: Tue Sep 09, 2008 4:21 am
by tan
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 и он уже инициализован в главном приложении. Я об этом уже неоднократно писал здесь на форуме.

Posted: Tue Sep 09, 2008 5:03 am
by ONEEYEMAN
tan,
Тут проблема вот еще в чем.
В моем приложении 2 вида DLL: динамическая библиотека и статическая библиотека.
Поэтому чтобы удовлетворить запросы первой использую DLL-build wx'а.

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

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

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

Posted: Tue Sep 09, 2008 5:49 am
by ONEEYEMAN
Ура!!!!! Заработало!!!!!! (C) Кот Матроскин.

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

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

Posted: Tue Sep 09, 2008 8:30 am
by T-Rex
Если не жалко, выложи сиходник примера сюда, может поможет кому в будущем ибо вопрос очень часто поднимается.

Posted: Fri Sep 12, 2008 8:48 pm
by ONEEYEMAN
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...