Собстевнно: Есть некая dll, которую надо загрузить в программу. Dll устроена таким образом что всё общение с ней происходит по средствам пересылки виндовых сообщений. Т.е. теоретически вызывав LoadLibrary, dll в DllMain должна создать свой цикл сообшений и начать общаться сообщениями с программой.
Теперь проблема: После вызова LoadLibrary("gwdll.dll") управление в программу не возвращается, а всё виснит колом. Это неудивительно, т.к. в DllMain нельзя создавать Threadы и выполнять синхронизацию. Удивляет другое, есть программа(написанная темиже людьми что и dll) которая нормально загружает эту dll, и работает сней.
Наконец вопрос: может я чегото не понимаю или делаю неправильно? Есть ли други способы явной загрузки dll????
PS: Исходников dll и их программы нет, есть только описание как загрузить и общаться с dll сообщениями. Загрузить dll неявно нельзя, ей для работы надо знать HWND окна в которое она будет слать сообщения(т.е. загрузка должна быть после того как создаться окно программы, и наче ругается MessageBox-ом).
Здравствуйте, fdn, Вы писали:
fdn>PS: Исходников dll и их программы нет, есть только описание как загрузить и общаться с dll сообщениями. Загрузить dll неявно нельзя, ей для работы надо знать HWND окна в которое она будет слать сообщения(т.е. загрузка должна быть после того как создаться окно программы, и наче ругается MessageBox-ом).
Вот это странно. В LoadLibrary ведь HWND не передается, как же она его тогда узнает? Дайте ссылочку на описание (или процитируйте), разберемся.
Здравствуйте, Alex Fedotov, Вы писали:
AF>Вот это странно. В LoadLibrary ведь HWND не передается, как же она его тогда узнает? Дайте ссылочку на описание (или процитируйте), разберемся.
В описании к сожадению нет нечего интересного там только сказано сделать LoadLibrary и собщения расписаны(дать смогу тока в понедельник).
По поводу HWND, судя по дебагеру, там просто вызывается GetActiveWindow(VOID);
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 в своей программе???
Здравствуйте, Аноним, Вы писали:
А>К сожалению не всё так просто. Как я писал выше, чтобы получить 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
Здравствуйте, ekamaloff, Вы писали:
E>Здравствуйте, Аноним, Вы писали:
А>>К сожалению не всё так просто. Как я писал выше, чтобы получить HWND окна они в dll вызывают GetActiveWindow(VOID);. Она вернёт HWND активного окна той нити из которой будте вызвана. Т.е. если создать dll из отдельной нити, то HWND будет равно 0, и мы опять получаем MessageBox с ошибкой.
E>Так ты сначала создай окно в этой нити, а потом вызывай LoadLibrary.
Так неполучится, ну создам я нит и окно, ну запущу цикл сообщений в нем, вызову LoadLibrary всё в ней и повиснит.
Dll должна слать сообщения в туже нить из которой загружена.
Hello Аноним, you wrote:
> В DllMain они точно создают свою нить, и виснит всё в WaitForSingleObject. Но как тогда они загружают dll в своей программе???
Может они сигналят тем, что ждет WaitForSingleObject?