Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не выгружается dll 
:(
    Опции темы
prefer
Дата 28.11.2008, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 6.12.2007

Репутация: нет
Всего: нет



Добого времени суток!

Собственно код:

Код


HINSTANCE hUtilDll; 

BOOL APIENTRY DllMain( HANDLE hModule,DWORD  ul_reason_for_call,LPVOID lpReserved)
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:    
 
     ....

    hUtilDll=LoadLibraryW(L"\\Program Files\\map_mt\\Utils.dll"); 

    ....
    break;
    case DLL_PROCESS_DETACH:
    
    ....

    if (!FreeLibrary(hUtilDll))
            MessageBox(NULL,L"Билиотека не выгрузилась",L"",MB_OK);
    ....
    break; 
    }
return TRUE;
}


dll как видно, загружается из другой dll, и юзает её функции....
Всё дело в том, что при выгрузке основной dll  не выскакивает MessageBox => библиотека должна выгрузится, но видимо что-то её загружает позже... хз...

пысы: Win Mobile 5, основная dll - плагин today..




PM MAIL   Вверх
Lazin
Дата 28.11.2008, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 8
Всего: 154



Цитата(prefer @  28.11.2008,  15:59 Найти цитируемый пост)
dll как видно, загружается из другой dll, и юзает её функции....

ф-ии LoadLibrary, FreeLibrary нельзя вызывать в DLLMain, кури MSDN
PM MAIL Skype GTalk   Вверх
prefer
Дата 28.11.2008, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 6.12.2007

Репутация: нет
Всего: нет



стал вызывать в обработчике вот так:

Код

LRESULT CALLBACK WndProc (HWND hwnd, UINT uimessage, WPARAM wParam, LPARAM lParam) 
{
....
switch (uimessage)
    {          
    case WM_TODAYCUSTOM_QUERYREFRESHCACHE: 
    ....
    hUtilDll=LoadLibraryW(L"\\Program Files\\map_mt\\Utils.dll");
    FreeLibrary(hUtilDll);
    
    return TRUE;
    .....
    }
    return DefWindowProc (hwnd, uimessage, wParam, lParam) ;
}


тоже самое, загружается и тут же выгружается, никакие функции из dll не подгружаю
PM MAIL   Вверх
Lazin
Дата 28.11.2008, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 8
Всего: 154



Цитата(prefer @  28.11.2008,  16:48 Найти цитируемый пост)
загружается и тут же выгружается

что не удивительно, ибо
Цитата(prefer @  28.11.2008,  16:48 Найти цитируемый пост)
Код

    hUtilDll=LoadLibraryW(L"\\Program Files\\map_mt\\Utils.dll");
    FreeLibrary(hUtilDll);

ты загружаешь длл, и сразу выгружаешь

Это сообщение отредактировал(а) Lazin - 28.11.2008, 16:53
PM MAIL Skype GTalk   Вверх
prefer
Дата 28.11.2008, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 6.12.2007

Репутация: нет
Всего: нет



хочу сказать, что она "типа" выгружается, хотя dll удалить нельзя, она висит в памяти
PM MAIL   Вверх
GremlinProg
Дата 28.11.2008, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(Lazin @  28.11.2008,  18:01 Найти цитируемый пост)
-ии LoadLibrary, FreeLibrary нельзя вызывать в DLLMain

как так?
Цитата(prefer @  28.11.2008,  17:59 Найти цитируемый пост)
Всё дело в том, что при выгрузке основной dll  не выскакивает MessageBox...

а в чем проблема-то? У тебя MessageBox вызывается только в случае невыгрузки библиотеки:
Цитата(prefer @  28.11.2008,  17:59 Найти цитируемый пост)
if (!FreeLibrary(hUtilDll))            MessageBox(NULL,L"Билиотека не выгрузилась",L"",MB_OK);




--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
DominiK
Дата 28.12.2008, 02:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 11.3.2007
Где: Россия, Омск

Репутация: нет
Всего: нет



Выпал smile 
PM MAIL   Вверх
GoldFinch
Дата 28.12.2008, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 2
Всего: 26



LoadLibrary можно вызывать в DllMain только если длл уже загружена, тогда сразу возвращается ее хендл, а фактической загрузки не происходит.
Загружать еще не загруженную длл в DllMain нельзя. Читайте msdn там все написано.
PM MAIL ICQ   Вверх
GremlinProg
Дата 28.12.2008, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



GoldFinch, в MSDN черным по белому написано:
Цитата

Warning  The entry-point function should perform only simple initialization or termination tasks. It must not call the LoadLibrary or LoadLibraryEx function (or a function that calls these functions), because this may create dependency loops in the DLL load order. This can result in a DLL being used before the system has executed its initialization code. Similarly, the entry-point function must not call the FreeLibrary function (or a function that calls FreeLibrary), because this can result in a DLL being used after the system has executed its termination code.


Добавлено через 2 минуты и 12 секунд
т.е. это предостережение от загрузки в длл самой себя, что естественно породит рекурсивные вызовы DllMain
ни каких системных ограничений для DllMain в этом плане не существует


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
ama_kid
Дата 28.12.2008, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 5
Всего: 95



Цитата(GremlinProg @  28.12.2008,  16:34 Найти цитируемый пост)
т.е. это предостережение от загрузки в длл самой себя,
Как раз относительно "самой себя" нигде ничего не сказано - сказано, что нельзя использовать LoadLibrary. 
Цитата
Only one thread at a time can call the entry-point function.
Как раз системное ограничение в виде принципиальной однопоточности Dll-EntryPoint и вызывает ограничение на вызов LoadLibrary в DllMain, что приводит к рекурсивному вызову другой DllMain, что делать нельзя...


--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
GremlinProg
Дата 28.12.2008, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(ama_kid @  28.12.2008,  18:42 Найти цитируемый пост)
Как раз относительно "самой себя" нигде ничего не сказано - сказано, что нельзя использовать LoadLibrary. 

Цитата

...because this may create dependency loops in the DLL load order. This can result in a DLL being used before the system has executed its initialization code

что есть рекурсия?
что есть рекурсия, в DLLMain, ama_kid?
Цитата(GremlinProg @  28.12.2008,  17:34 Найти цитируемый пост)
ни каких системных ограничений для DllMain в этом плане не существует

о потоках речи и не идет

Добавлено через 4 минуты и 30 секунд
вообще-то, перед первым постом, я потратил 5 минут на сборку 2 длл и загрузку одной из другой в DllMain, поэтому и берусь утверждать о трактовке (а по сути, о варианте, перевода) предупреждения из MSDN, несущего рекомандательный характер, как если бы мы сказали: делай только в том случае, если если знаешь, что делаешь.


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
GoldFinch
Дата 28.12.2008, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 2
Всего: 26



значит надо убедиться только в том, что длл которая загружается в ДллМейн не попытается загрузить длл которая ее загружает?
PM MAIL ICQ   Вверх
ama_kid
Дата 28.12.2008, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 5
Всего: 95



Цитата(GremlinProg @  28.12.2008,  17:56 Найти цитируемый пост)
вообще-то, перед первым постом, я потратил 5 минут на сборку 2 длл и загрузку одной из другой в DllMain, поэтому и берусь утверждать о трактовке (а по сути, о варианте, перевода) предупреждения из MSDN, несущего рекомандательный характер, как если бы мы сказали: делай только в том случае, если если знаешь, что делаешь. 
То, что в даннный момент не возникло проблем - еще ничего не значит smile
Цитата(http://msdn.microsoft.com/en-us/library/ms682583.aspx)
Calling functions that require DLLs other than Kernel32.dll may result in problems that are difficult to diagnose. For example, calling User, Shell, and COM functions can cause access violation errors, because some functions load other system components. Conversely, calling functions such as these during termination can cause access violation errors because the corresponding component may already have been unloaded or uninitialized.



--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
GremlinProg
Дата 28.12.2008, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(ama_kid @  28.12.2008,  19:46 Найти цитируемый пост)
То, что в даннный момент не возникло проблем - еще ничего не значит

конечно, ama_kid, не спорю
я защищал только само "право на вызов", поскольку, сразу как увидел фразу о его запрете, тут же появились сомнения,
поскольку реализовать такой запрет - смерти подобно, все равно, что запретить вложенность директив типа include, да и сложно бы было объяснить нескольким миллионам программистов, что запрет стоит только для того, чтобы они, такие хорошие, по неопытности не понаделали бы ошибок

а цитата касается по-сути, того же, что уже говорилось ранее: изучайте инструменты, которыми пользуетесь, поскольку некоторые функции могут динамически подгружать другие библиотеки, что потенциально может привести к тому же результату,
незнание не освобождает от ответственности

GoldFinch, рекурсия может быть и косъвенной, предостережение MSDN призывает учитывать сложность иерархии загрузок, это, по-сути - дерево библиотек, в котором циклы могут иметь критические последствия


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
GoldFinch
Дата 28.12.2008, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 2
Всего: 26



GremlinProg, ты знаеш какие дллки подгружают системные библиотеки? это же нигде не документировано. а если и знаеш, то откуда те знать как это будет в следующем сервиспаке винды?
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0945 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.