![]() |
|
Модераторы: 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() завершилась, а другие потоки продолжали работать но тут как раз противоположный случай |
|||
|
||||
| 586 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2243 Регистрация: 8.5.2006 Репутация: 39 Всего: 146 |
Практически все приложения используют ExitProcess. В том числе приложения, скомпилированные в C++ Builder и Delphi. Это сообщение отредактировал(а) 586 - 1.8.2010, 10:09 |
|||
|
||||
| HellStranger |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 107 Регистрация: 1.9.2009 Репутация: нет Всего: -1 |
Ну сам по себе вызов LoadLibrary никаких дополнительных потоков не создаёт, если конечно в обработчике DLL_PROCESS_ATTACH этой библиотеки не стоит CreateThread/_beginthreadex... Вы подробнее описать проблему не можете?.. Да и вообще давайте рассуждать логически: если функия потока создаваемого потока (извиняюсь за масло масленное) находится в DLL, и при её выгрузке поток корректно не завершается и продолжает работать, то сразу же должен вылетать access violation. Так как образ DLL уже отгружен от адресного пространства вашего процесса. MSHTML.DLL вряд-ли так криво реализована... Ну уж очень нестандартное решение... ))))))))) Contains processor-specific register data. The system uses CONTEXT structures to perform various internal operations. Refer to the header file WinNT.h for definitions of this structure for each processor architecture. Не обращали внимания на эту идиотскую по-вашему мнению информацию из MSDN?.. ))))))))) А вот вам:
Где поле поле регистра Eip?.. Или под каждую архитектуру своё завершение писать?.. Пока ещё такого не было, но всё-таки соглашусь с Abyx: вы бредите. Хотя подход безусловно интересный, но не нестандартный, а нерабочий... Это сообщение отредактировал(а) HellStranger - 2.8.2010, 14:07 |
||||
|
|||||
| Abyx |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 601 Регистрация: 3.11.2009 Репутация: 2 Всего: 10 |
HellStranger, у вас по умолчанию платформа xeon? у меня - по умолчанию x86-32
какбэ в WinNT.h нужная структура CONTEXT выбирается дефайнами (#ifdef). Это сообщение отредактировал(а) Abyx - 2.8.2010, 14:10 |
|||
|
||||
| HellStranger |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 107 Регистрация: 1.9.2009 Репутация: нет Всего: -1 |
Вы, наверное, слепые или просто далеки от мысли... Я привёл пример структуры CONTEXT под архитектурой, где указанного поля регистра EIP просто напросто нет, тем самым указав аппаратную зависимость решения, предложенного 12usver12. Или вы у нас настолько продвинутый программист, что под каждый процессор пишите отдельно, но используете при этом cpp?.. "ОЧЕНЬ УМНЫЙ" ПОДХОД! Удачи в вашем нелёгком (читать по-другому... Добавлю только, что вместо того, чтобы ответить на мою просьбу уточнить суть проблемы, вы начинаете искать повод превратить тему в балаган, делаю вывод, что вы баба базарная... И всё-же, посоветую вам для решения проблемы прочесть Рихтера главы 19 и в особенности 20, где, я уверен, ваша проблема описана и решена. Это сообщение отредактировал(а) HellStranger - 2.8.2010, 14:36 |
|||
|
||||
| Abyx |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 601 Регистрация: 3.11.2009 Репутация: 2 Всего: 10 |
HellStranger, вы такой забавный) пишите еще
естественно использование регистра eip - это платформозависимое решение, это только x86-32. это очевидная вещь же. проблема поднятая в этой теме полностью раскрыта в этой теме, и уточнять там нечего. в конце концов вы сами можете воспроизвести ситуацию вызвав LoadLibrary("MSHTML.DLL") под отладчиком |
|||
|
||||
| HellStranger |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 107 Регистрация: 1.9.2009 Репутация: нет Всего: -1 |
К вашему сведению EIP-регистр общего назначения, присутствующий во всей архитектуре IA-32/64 (в том числе и в XEON), и всё-же решение на его основе даже для данной платформы не подходят. Вы тоже забавный, настолько, что отвечать на ваши посты я смысла больше не вижу... Сам шучу- сам смеюсь это про вас... |
|||
|
||||
| Abyx |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 601 Регистрация: 3.11.2009 Репутация: 2 Всего: 10 |
HellStranger, я открою вам страшную тайну, первая буква в Eip говорит что это только x32, и никак не x64. там он называется Rip
|
|||
|
||||
| Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 16 Всего: 39 |
А кто сказал что по FreeLibrary билиотека будет выгружена из адресного пространства по DLL_PROCESS_DETACH, если вернем false то DLL не будет выгружена? Может бы все проще ? Автор не вызвал нужные функции для закрытия всех ресурсов ? -------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
| Abyx |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 601 Регистрация: 3.11.2009 Репутация: 2 Всего: 10 |
||||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 40 Всего: 223 |
А можно узнать, зачем звать LoadLibrary("MSHTML.DLL") когда можно (и нужно) просто создать COM объект (один из поддерживаемых ею)? Возможно она (MSHTML.DLL) не рассчитана на то, что ее будет грузить НЕ COM менеджер?
|
|||
|
||||
| Abyx |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 601 Регистрация: 3.11.2009 Репутация: 2 Всего: 10 |
xvr, вообще-то создание ком-объекта сопровождается загрузкой библиотеки.
COM менеджер - это что? посмотрите реализацию CoCreateInstance %) там есть LoadLibrary алсо она рассчитана на то что ее будут грузить не-COM менеджер |
|||
|
||||
| xvr |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 40 Всего: 223 |
Да, упоминания в MSDN есть. А в примерах от MS ( http://www.microsoft.com/downloads/details...;displaylang=en / Htmldlg.exe) тоже остаются нитки при завершении? |
||||
|
|||||
| icecrashldr |
|
|||
![]() Developer ![]() Профиль Группа: Участник Сообщений: 122 Регистрация: 5.7.2010 Репутация: нет Всего: нет |
Abyx, Используйте ExitProcess, и не слушайте ШКОЛАТУ!
SetThreadContext(утечка памяти pending kernel services, а на WaitFor**** это вообще полный бред) TerminateThread - прямая утечка памяти(минимум Не корректное освобождения стека, + pending kernel services). Использования FreeLibrary есть очень плохо во вногих местах. При использовании FreeLibrary, вы должны быть уверены, что кроме вашего кода его не кто не использует, и в библиотеке не был создан поток. |
|||
|
||||
![]()
|
| Правила форума "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. |