![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| Abyx |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 601 Регистрация: 3.11.2009 Репутация: 2 Всего: 10 |
вызов LoadLibrary("MSHTML.DLL") создает поток
его можно как-то корректно прибить? FreeLibrary не помогает %) |
|||
|
||||
| Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 16 Всего: 39 |
код LoadLibrary вызовет DLL_PROCESS_ATTACH в свою очередь скорее всего в DllMain создается какой нить поток, хотя в MSDN на этот счет сказано что нельзя этого делать.
Ну если просто предположить что прибить поток DLL то вызвать FreeLibrary() -------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
| Abyx |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 601 Регистрация: 3.11.2009 Репутация: 2 Всего: 10 |
||||
|
||||
| Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 16 Всего: 39 |
Читаем тут http://msdn.microsoft.com/en-us/library/ms...3(v=VS.85).aspx
http://msdn.microsoft.com/en-us/library/ms...6(v=VS.85).aspx -------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
| 12usver12 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 247 Регистрация: 5.1.2007 Репутация: 1 Всего: 1 |
1) просплайсь у себя в процессе функу CreateThread и в обработчие по lpStartAdress определяй модуль (mshtml ) не давай создаваться потоку возращай 0
2) использовать другуя dll и может в обработчике DLL_thread_attach чтото попробовать 3) ну и TerminateThread можно пробовать |
|||
|
||||
| Abyx |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 601 Регистрация: 3.11.2009 Репутация: 2 Всего: 10 |
цитату приведите, я то я там что-то не нашел ничего про то что нельзя запускать потоки из DllMain |
|||
|
||||
| Abyx |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 601 Регистрация: 3.11.2009 Репутация: 2 Всего: 10 |
||||
|
||||
| 12usver12 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 247 Регистрация: 5.1.2007 Репутация: 1 Всего: 1 |
еще из этой оперы.
SuspendThread -> GetThreadContext -> eip = adrExitThread -> SetThreadContext-> ResumeThread это нестандартное решение нестандартной задачи - если оно вам кажется бредом - это ваши проблемы |
|||
|
||||
| 12usver12 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 247 Регистрация: 5.1.2007 Репутация: 1 Всего: 1 |
|
|||
|
||||
| 586 |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2243 Регистрация: 8.5.2006 Репутация: 39 Всего: 146 |
Если есть сомнения по поводу выгрузки библиотеки, то вызывай функцию DllCanUnloadNow:
Это сообщение отредактировал(а) 586 - 1.8.2010, 01:25 |
||||
|
|||||
| Abyx |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 601 Регистрация: 3.11.2009 Репутация: 2 Всего: 10 |
586, у меня нет сомнений в том что библиотеку надо выгрузить: я закрываю программу, и хочу корректно освободить все ресурсы. Разумеется ExitProcess() убьет все потоки, но мне хочется какого-то более правильного способа.
Добавлено через 12 минут и 19 секунд 12usver12, тот код который вы привели - это не "корректное завершение потока". Это еще более некорректное завершение потока, нежели TerminateThread. ExitThread вызванная в произвольном месте по эффекту не отличается от TerminateThread, но переключение контекста потока это вообще жесть. Поток может выполнять какой угодно код, и не факт что в этот момент его можно вызывать ExitThread. Например можно запросто словить дедлок который повесит весь процесс. алсо, в сакральный смысл делать асм-вставку для ExitThread? типа хотели показать что знаете асм? можно сразу написать "ctx.Eip = (DWORD)&ExitThread;", его параметр никому не нужен. |
|||
|
||||
| 586 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2243 Регистрация: 8.5.2006 Репутация: 39 Всего: 146 |
Ресурсы, которые предоставляет библиотека MSHTML.DLL - это COM-интерфейсы. Если DllCanUnloadNow возвращает S_OK, то все интерфейсы освобождены, и освобождать больше нечего. По поводу потоков - такая-же проблема есть при использовании диалога OpenDialog - тоже там остаются висящие потоки. И никого это не беспокоит. К такому выводу я пришёл, когда запустил "Блокнот" в отладчике. Судя по примеру в MSDN и твоей теме, код вроде правильный. Это сообщение отредактировал(а) 586 - 1.8.2010, 09:45 |
|||
|
||||
| Abyx |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 601 Регистрация: 3.11.2009 Репутация: 2 Всего: 10 |
586, код стал правильным только когда я добавил ExitProcess()
вобщем-то это решение, но если мне надо будет временно запустить диалог, это не есть хорошо, что создается 1 поток при загрузке длл, и еще 10 при запуске ShowHTMLDialog. Хотелось бы как-то это разрулить %) |
|||
|
||||
| 586 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2243 Регистрация: 8.5.2006 Репутация: 39 Всего: 146 |
Если компилировать прогу с рантаймом (без директивы #pragma comment(linker, "/entry:main")), то всё завершится нормально. А всё потому, что рантайм вызывает ExitProcess. Так что нормально, что вызываешь ExitProcess в чисто винапишной проге. |
|||
|
||||
| Abyx |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 601 Регистрация: 3.11.2009 Репутация: 2 Всего: 10 |
наверное действительно надо просто не обращать на них внимание, и всегда юзать ExitProcess при закрытии программы
Добавлено через 1 минуту и 17 секунд 586, я знаю что рантайм вызывает ExitProcess =) иногда это очень раздражает, когда хочешь чтобы main() завершилась, а другие потоки продолжали работать но тут как раз противоположный случай |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |