Вызов LoadLibrary из DllMain
От: Abyx Россия  
Дата: 15.08.10 13:05
Оценка:
В MSDN написано: (ссылка)

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.

Эксперименты показали, что ничего такого не происходит.

Покажите код который приведет к проблемам из за использования LoadLibrary в DllMain.
In Zen We Trust
Re: Вызов LoadLibrary из DllMain
От: Jolly Roger  
Дата: 15.08.10 13:09
Оценка:
Здравствуйте, Abyx, Вы писали:

A>В MSDN написано: (ссылка)

A>

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.

A>Эксперименты показали, что ничего такого не происходит.

А что "такое" должно происходить?
"Нормальные герои всегда идут в обход!"
Re: Вызов LoadLibrary из DllMain
От: LuciferSaratov Россия  
Дата: 15.08.10 13:19
Оценка:
Здравствуйте, Abyx, Вы писали:

A>В MSDN написано: (ссылка)

A>

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.

A>Эксперименты показали, что ничего такого не происходит.

A>Покажите код который приведет к проблемам из за использования LoadLibrary в DllMain.


lib1.dll:
DllMain() {
  LoadLibrary("lib2.dll");
}

lib2.dll:
DllMain() {
  LoadLibrary("lib1.dll");
}


Я думаю, вот это имелось ввиду.
Re[2]: Вызов LoadLibrary из DllMain
От: Abyx Россия  
Дата: 15.08.10 14:23
Оценка:
Здравствуйте, Jolly Roger, Вы писали:
JR>А что "такое" должно происходить?
сам не знаю, но написано же, "must not call"
In Zen We Trust
Re[2]: Вызов LoadLibrary из DllMain
От: Abyx Россия  
Дата: 15.08.10 14:27
Оценка:
Здравствуйте, LuciferSaratov, Вы писали:
LS>Я думаю, вот это имелось ввиду.
Сначала проверьте, а потом постите сюда =\
Этот код выполняется без каких либо проблем. LoadLibrary("lib1.dll") ничего не делает, т.к. lib1.dll уже загружена.

Меня интересуют рабочие примеры проблем с LoadLibrary в DllMain %)
In Zen We Trust
Re: Вызов LoadLibrary из DllMain
От: ononim  
Дата: 15.08.10 14:30
Оценка: +1
A>Покажите код который приведет к проблемам из за использования LoadLibrary в DllMain.
У меня был практические проблемы использования RegOpenKey из dllmain моей длл — валилось, т.к. DllMain моей длл исполнялся раньше чем advapi32'шный. Апликуха линковалась на обе эти длл, и еще на другие, которые тоже линковались на advapi32, то есть раскрутить бесконфликтный граф исполнения dllmain'ов загрузчику не удалось. Кстати воспроизводилась проблема не на всех системах. Вероятно на некоторых загрузчик вначале исполнял dllmain advapi32
Как много веселых ребят, и все делают велосипед...
Re[3]: Вызов LoadLibrary из DllMain
От: Jolly Roger  
Дата: 15.08.10 14:53
Оценка:
Здравствуйте, Abyx, Вы писали:

A>Здравствуйте, Jolly Roger, Вы писали:

JR>>А что "такое" должно происходить?
A>сам не знаю, но написано же, "must not call"

Хм, но ведь там-же ясно написано "may create", " can result". То есть проблемы возможны, но не обязательны. А "must not call" потому, что отсутствие проблем сейчас не гарантирует их отсутствие и в будущем.
"Нормальные герои всегда идут в обход!"
Re: Вызов LoadLibrary из DllMain
От: Pavel Dvorkin Россия  
Дата: 15.08.10 15:11
Оценка: 12 (1) +1
Здравствуйте, Abyx, Вы писали:

A>В MSDN написано: (ссылка)

A>

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.

A>Эксперименты показали, что ничего такого не происходит.

A>Покажите код который приведет к проблемам из за использования LoadLibrary в DllMain.


Загружаем DLL1. Исполняется ее DLLMain. В ней загружаем DLL2. Исполняется ее DLLMain как часть LoadLibrary. Вызываем теперь из DLL2 некую функцию DLL1. Она будет выполнена при том. что еще не завершилась DLLMain в DLL1.
With best regards
Pavel Dvorkin
Re[2]: Вызов LoadLibrary из DllMain
От: Abyx Россия  
Дата: 15.08.10 15:32
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Загружаем DLL1. Исполняется ее DLLMain. В ней загружаем DLL2. Исполняется ее DLLMain как часть LoadLibrary. Вызываем теперь из DLL2 некую функцию DLL1. Она будет выполнена при том. что еще не завершилась DLLMain в DLL1.


То что надо! Спасибо.
In Zen We Trust
Re: Вызов LoadLibrary из DllMain
От: kai3  
Дата: 15.08.10 16:02
Оценка:
Здравствуйте, Abyx, Вы писали:

A>В MSDN написано: (ссылка)

A>

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.

A>Эксперименты показали, что ничего такого не происходит.

A>Покажите код который приведет к проблемам из за использования LoadLibrary в DllMain.


LoadLibrary("wininet.dll") — проблема возникает не из-за загрузки dll, а из-за того что там вызывается CreateThread, который в свою очередь посылает в dllmain сообщение THREAD_ATTACH, вообщем получается бесконечный цикл.
Re[2]: Вызов LoadLibrary из DllMain
От: Abyx Россия  
Дата: 15.08.10 16:16
Оценка:
Здравствуйте, kai3, Вы писали:

K>LoadLibrary("wininet.dll") — проблема возникает не из-за загрузки dll, а из-за того что там вызывается CreateThread, который в свою очередь посылает в dllmain сообщение THREAD_ATTACH, вообщем получается бесконечный цикл.

У меня все работает.
Такой проблемы просто не может быть, т.к. поток запускается после завершения всех вложенных DllMain — там критическая секция, никаких циклов не возникает.
In Zen We Trust
Re[2]: Вызов LoadLibrary из DllMain
От: ononim  
Дата: 15.08.10 16:39
Оценка:
K>LoadLibrary("wininet.dll") — проблема возникает не из-за загрузки dll, а из-за того что там вызывается CreateThread, который в свою очередь посылает в dllmain сообщение THREAD_ATTACH, вообщем получается бесконечный цикл.
Все в этом отношении с wininet хорошо — потоки из dllmain стартовать можно, если очень осторожно (с)
В wininet я другой баг видел — если ее динамически загружать, потом юзать, и потом динамически _выгружать_ через FreeLibrary, то какаято версия wininet частенько зависала ибо в PROCESS_DETACH ждала какого то своего потока. В случае статической линковки на wininet такой проблемы не было, ибо перед нотификацией статических загруженных длл загрузчик (вернее, выгрузчик вначале убивает все потоки приложения, кроме основного.
Как много веселых ребят, и все делают велосипед...
Re[2]: Вызов LoadLibrary из DllMain
От: CyberDemon Россия  
Дата: 15.08.10 18:03
Оценка:
Здравствуйте, kai3, Вы писали:

K>LoadLibrary("wininet.dll") — проблема возникает не из-за загрузки dll, а из-за того что там вызывается CreateThread, который в свою очередь посылает в dllmain сообщение THREAD_ATTACH, вообщем получается бесконечный цикл.

Потому и рекомендуют вызывать DisableThreadLibraryCalls
Re[3]: Вызов LoadLibrary из DllMain
От: ononim  
Дата: 15.08.10 18:07
Оценка: +1
K>>LoadLibrary("wininet.dll") — проблема возникает не из-за загрузки dll, а из-за того что там вызывается CreateThread, который в свою очередь посылает в dllmain сообщение THREAD_ATTACH, вообщем получается бесконечный цикл.
CD>Потому и рекомендуют вызывать DisableThreadLibraryCalls
DisableThreadLibraryCalls не поможет от дедлока на ожидании начала исполнения или завершения потока. Рекомендуют его совсем по другой причине.
Как много веселых ребят, и все делают велосипед...
Re[3]: Вызов LoadLibrary из DllMain
От: kai3  
Дата: 15.08.10 19:40
Оценка:
Здравствуйте, ononim, Вы писали:

K>>LoadLibrary("wininet.dll") — проблема возникает не из-за загрузки dll, а из-за того что там вызывается CreateThread, который в свою очередь посылает в dllmain сообщение THREAD_ATTACH, вообщем получается бесконечный цикл.

O>Все в этом отношении с wininet хорошо — потоки из dllmain стартовать можно, если очень осторожно (с)
O>В wininet я другой баг видел — если ее динамически загружать, потом юзать, и потом динамически _выгружать_ через FreeLibrary, то какаято версия wininet частенько зависала ибо в PROCESS_DETACH ждала какого то своего потока. В случае статической линковки на wininet такой проблемы не было, ибо перед нотификацией статических загруженных длл загрузчик (вернее, выгрузчик вначале убивает все потоки приложения, кроме основного.

Да, у меня как раз так и было... библиотека динамически подгружалась, и выполнение после LoadLibrary("wininet.dll") не продолжалось, думал что это связано с созданием потока внутри инициализации wininet.dll. Протрассировал dllmain в wininet.dll, выполнение остановилось на вызове CreateThread.

Значит это все таки бага...
Re: Вызов LoadLibrary из DllMain
От: lxa http://aliakseis.livejournal.com
Дата: 16.08.10 08:11
Оценка:
Здравствуйте, Abyx, Вы писали:

A>Эксперименты показали, что ничего такого не происходит.


A>Покажите код который приведет к проблемам из за использования LoadLibrary в DllMain.


Пушной зверек LoaderLock может наступить.
Re[2]: Вызов LoadLibrary из DllMain
От: lxa http://aliakseis.livejournal.com
Дата: 16.08.10 08:19
Оценка:
lxa>Пушной зверек LoaderLock может наступить.

Не уверен ... Но вообще LoaderLock — страшное животное
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.