LoadLibrary, DllMain, и DeadLock???
От: fdn  
Дата: 03.02.06 18:03
Оценка:
Собстевнно: Есть некая dll, которую надо загрузить в программу. Dll устроена таким образом что всё общение с ней происходит по средствам пересылки виндовых сообщений. Т.е. теоретически вызывав LoadLibrary, dll в DllMain должна создать свой цикл сообшений и начать общаться сообщениями с программой.

Теперь проблема: После вызова LoadLibrary("gwdll.dll") управление в программу не возвращается, а всё виснит колом. Это неудивительно, т.к. в DllMain нельзя создавать Threadы и выполнять синхронизацию. Удивляет другое, есть программа(написанная темиже людьми что и dll) которая нормально загружает эту dll, и работает сней.

Наконец вопрос: может я чегото не понимаю или делаю неправильно? Есть ли други способы явной загрузки dll????

PS: Исходников dll и их программы нет, есть только описание как загрузить и общаться с dll сообщениями. Загрузить dll неявно нельзя, ей для работы надо знать HWND окна в которое она будет слать сообщения(т.е. загрузка должна быть после того как создаться окно программы, и наче ругается MessageBox-ом).
Re: LoadLibrary, DllMain, и DeadLock???
От: Alex Fedotov США  
Дата: 03.02.06 18:23
Оценка:
Здравствуйте, fdn, Вы писали:

fdn>PS: Исходников dll и их программы нет, есть только описание как загрузить и общаться с dll сообщениями. Загрузить dll неявно нельзя, ей для работы надо знать HWND окна в которое она будет слать сообщения(т.е. загрузка должна быть после того как создаться окно программы, и наче ругается MessageBox-ом).


Вот это странно. В LoadLibrary ведь HWND не передается, как же она его тогда узнает? Дайте ссылочку на описание (или процитируйте), разберемся.
-- Alex Fedotov
Re[2]: LoadLibrary, DllMain, и DeadLock???
От: fdn  
Дата: 03.02.06 19:02
Оценка:
Здравствуйте, Alex Fedotov, Вы писали:

AF>Вот это странно. В LoadLibrary ведь HWND не передается, как же она его тогда узнает? Дайте ссылочку на описание (или процитируйте), разберемся.


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

По поводу HWND, судя по дебагеру, там просто вызывается GetActiveWindow(VOID);
Re: LoadLibrary, DllMain, и DeadLock???
От: Slava Antonov Россия http://deadbeef.narod.ru
Дата: 04.02.06 04:20
Оценка:
Hello fdn, you wrote:

> Наконец вопрос: может я чегото не понимаю или делаю неправильно? Есть ли други способы явной загрузки dll????


Мне думается что они dll грузят в отдельном потоке.
А виснет мне думается потому, раз они огранизуют цикл выборки сообщений прямо в DllMain, то LoadLibrary ждет, пока она не завершит свою работу.

--
Всего хорошего, Слава
ICQ: 197577902
Posted via RSDN NNTP Server 2.0
Re[2]: LoadLibrary, DllMain, и DeadLock???
От: Аноним  
Дата: 04.02.06 05:40
Оценка:
Здравствуйте, Slava Antonov, Вы писали:

SA>Hello fdn, you wrote:


SA>Мне думается что они dll грузят в отдельном потоке.

SA>А виснет мне думается потому, раз они огранизуют цикл выборки сообщений прямо в DllMain, то LoadLibrary ждет, пока она не завершит свою работу.

К сожалению не всё так просто. Как я писал выше, чтобы получить HWND окна они в dll вызывают GetActiveWindow(VOID);. Она вернёт HWND активного окна той нити из которой будте вызвана. Т.е. если создать dll из отдельной нити, то HWND будет равно 0, и мы опять получаем MessageBox с ошибкой.

В DllMain они точно создают свою нить, и виснит всё в WaitForSingleObject. Но как тогда они загружают dll в своей программе???
Re[3]: LoadLibrary, DllMain, и DeadLock???
От: ekamaloff Великобритания  
Дата: 04.02.06 05:48
Оценка:
Здравствуйте, Аноним, Вы писали:

А>К сожалению не всё так просто. Как я писал выше, чтобы получить HWND окна они в dll вызывают GetActiveWindow(VOID);. Она вернёт HWND активного окна той нити из которой будте вызвана. Т.е. если создать dll из отдельной нити, то HWND будет равно 0, и мы опять получаем MessageBox с ошибкой.


Так ты сначала создай окно в этой нити, а потом вызывай LoadLibrary.
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
Re[4]: LoadLibrary, DllMain, и DeadLock???
От: fdn  
Дата: 04.02.06 06:29
Оценка:
Здравствуйте, ekamaloff, Вы писали:

E>Здравствуйте, Аноним, Вы писали:


А>>К сожалению не всё так просто. Как я писал выше, чтобы получить HWND окна они в dll вызывают GetActiveWindow(VOID);. Она вернёт HWND активного окна той нити из которой будте вызвана. Т.е. если создать dll из отдельной нити, то HWND будет равно 0, и мы опять получаем MessageBox с ошибкой.


E>Так ты сначала создай окно в этой нити, а потом вызывай LoadLibrary.


Так неполучится, ну создам я нит и окно, ну запущу цикл сообщений в нем, вызову LoadLibrary всё в ней и повиснит.

Dll должна слать сообщения в туже нить из которой загружена.

PS я так пробовал, те же яйца выходят .
Re[3]: LoadLibrary, DllMain, и DeadLock???
От: Slava Antonov Россия http://deadbeef.narod.ru
Дата: 04.02.06 07:14
Оценка:
Hello Аноним, you wrote:

> В DllMain они точно создают свою нить, и виснит всё в WaitForSingleObject. Но как тогда они загружают dll в своей программе???


Может они сигналят тем, что ждет WaitForSingleObject?

--
Всего хорошего, Слава
ICQ: 197577902
Posted via RSDN NNTP Server 2.0
Re[5]: LoadLibrary, DllMain, и DeadLock???
От: Slava Antonov Россия http://deadbeef.narod.ru
Дата: 04.02.06 07:21
Оценка:
Hello fdn, you wrote:

> PS я так пробовал, те же яйца выходят .


Ну тогда остается последнее средство — отладчик
Взять да и подсмотреть как "они" сделали.

--
Всего хорошего, Слава
ICQ: 197577902
Posted via RSDN NNTP Server 2.0
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.