Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> LoadLibrary("MSHTML.DLL") создает поток 
:(
    Опции темы
Abyx
Дата 31.7.2010, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 601
Регистрация: 3.11.2009

Репутация: 2
Всего: 10



вызов LoadLibrary("MSHTML.DLL") создает поток
его можно как-то корректно прибить?
FreeLibrary не помогает %)
PM MAIL   Вверх
Dem_max
Дата 31.7.2010, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 16
Всего: 39



код LoadLibrary вызовет DLL_PROCESS_ATTACH в свою очередь скорее всего в DllMain создается какой нить поток, хотя в MSDN на этот счет сказано что нельзя этого делать.

Цитата

его можно как-то корректно прибить?

Ну если просто предположить что прибить поток DLL то вызвать FreeLibrary()



--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
Abyx
Дата 31.7.2010, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 601
Регистрация: 3.11.2009

Репутация: 2
Всего: 10



Dem_max, у вас плохо со зрением? Три строчки текста не прочитать? Я написал
Цитата(Abyx @  31.7.2010,  14:57 Найти цитируемый пост)
FreeLibrary не помогает %)


Цитата(Dem_max @  31.7.2010,  16:07 Найти цитируемый пост)
в DllMain создается какой нить поток, хотя в MSDN на этот счет сказано что нельзя этого делать.

пруфлинк давай

Это сообщение отредактировал(а) Abyx - 31.7.2010, 15:19
PM MAIL   Вверх
Dem_max
Дата 31.7.2010, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 16
Всего: 39





--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
12usver12
Дата 31.7.2010, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 247
Регистрация: 5.1.2007

Репутация: 1
Всего: 1



1) просплайсь у себя в процессе функу CreateThread и в обработчие по lpStartAdress определяй модуль (mshtml ) не давай создаваться потоку возращай 0 
2) использовать другуя dll и может в обработчике DLL_thread_attach чтото попробовать  
3) ну и TerminateThread можно пробовать
PM MAIL   Вверх
Abyx
Дата 31.7.2010, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 601
Регистрация: 3.11.2009

Репутация: 2
Всего: 10




цитату приведите, я то я там что-то не нашел ничего про то что нельзя запускать потоки из DllMain
PM MAIL   Вверх
Abyx
Дата 31.7.2010, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 601
Регистрация: 3.11.2009

Репутация: 2
Всего: 10



Цитата(12usver12 @  31.7.2010,  16:46 Найти цитируемый пост)
просплайсь у себя в процессе функу CreateThread и в обработчие по lpStartAdress определяй модуль (mshtml ) не давай создаваться потоку возращай 0 

вы бредите
PM MAIL   Вверх
12usver12
Дата 31.7.2010, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 247
Регистрация: 5.1.2007

Репутация: 1
Всего: 1



еще из этой оперы. 
SuspendThread -> GetThreadContext -> eip = adrExitThread -> SetThreadContext-> ResumeThread 

это нестандартное решение нестандартной задачи - если оно вам кажется бредом - это ваши проблемы
PM MAIL   Вверх
12usver12
Дата 31.7.2010, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 247
Регистрация: 5.1.2007

Репутация: 1
Всего: 1



Код

void KillThread()
{
    __asm
    {
        push 0
        call ExitThread
    }
}
bool CorrectTerminateThread(HANDLE hThread)
{
    SuspendThread(hThread);
    CONTEXT ctx = {0}; 
    GetThreadContext(hThread, &ctx);
    ctx.Eip = (DWORD)&KillThread;
    SetThreadContext(hThread, &ctx);
    ResumeThread(hThread);
    return 1;
}

PM MAIL   Вверх
586
Дата 1.8.2010, 01:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



Цитата(Abyx @  31.7.2010,  14:57 Найти цитируемый пост)
вызов LoadLibrary("MSHTML.DLL") создает поток
его можно как-то корректно прибить?
FreeLibrary не помогает %) 

Если есть сомнения по поводу выгрузки библиотеки, то вызывай функцию DllCanUnloadNow:
Код
// HMODULE hMod = LoadLibrary("MSHTML.DLL");

void __fastcall TForm1::Button3Click(TObject *Sender)
{
    if(GetProcAddress(hMod, "DllCanUnloadNow")() == S_OK)
        ShowMessage("Эту библиотеку можно выгрузить.");
    else
        ShowMessage("Эту библиотеку выгружать нельзя!");   
}


Это сообщение отредактировал(а) 586 - 1.8.2010, 01:25
PM   Вверх
Abyx
Дата 1.8.2010, 08:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 601
Регистрация: 3.11.2009

Репутация: 2
Всего: 10



586, у меня нет сомнений в том что библиотеку надо выгрузить: я закрываю программу, и хочу корректно освободить все ресурсы. Разумеется ExitProcess() убьет все потоки, но мне хочется какого-то более правильного способа.

Добавлено через 12 минут и 19 секунд
12usver12, тот код который вы привели - это не "корректное завершение потока". Это еще более некорректное завершение потока, нежели TerminateThread. 
ExitThread вызванная в произвольном месте по эффекту не отличается от TerminateThread, но переключение контекста потока это вообще жесть. Поток может выполнять какой угодно код, и не факт что в этот момент его можно вызывать ExitThread. Например можно запросто словить дедлок который повесит весь процесс.

алсо, в сакральный смысл делать асм-вставку для ExitThread? типа хотели показать что знаете асм?

можно сразу написать "ctx.Eip = (DWORD)&ExitThread;", его параметр никому не нужен.
PM MAIL   Вверх
586
Дата 1.8.2010, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



Цитата(Abyx @  1.8.2010,  09:40 Найти цитируемый пост)
у меня нет сомнений в том что библиотеку надо выгрузить: я закрываю программу, и хочу корректно освободить все ресурсы. Разумеется ExitProcess() убьет все потоки, но мне хочется какого-то более правильного способа. 

Ресурсы, которые предоставляет библиотека MSHTML.DLL - это COM-интерфейсы. Если DllCanUnloadNow возвращает S_OK, то все интерфейсы освобождены, и освобождать больше нечего.
По поводу потоков - такая-же проблема есть при использовании диалога OpenDialog - тоже там остаются висящие потоки. И никого это не беспокоит. К такому выводу я пришёл, когда запустил "Блокнот" в отладчике. 
Судя по примеру в MSDN и твоей теме, код вроде правильный.

Это сообщение отредактировал(а) 586 - 1.8.2010, 09:45
PM   Вверх
Abyx
Дата 1.8.2010, 09:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 601
Регистрация: 3.11.2009

Репутация: 2
Всего: 10



586, код стал правильным только когда я добавил ExitProcess()
вобщем-то это решение, но если мне надо будет временно запустить диалог, это не есть хорошо, что создается 1 поток при загрузке длл, и еще 10 при запуске ShowHTMLDialog. Хотелось бы как-то это разрулить %)
PM MAIL   Вверх
586
Дата 1.8.2010, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



Цитата(Abyx @  1.8.2010,  10:48 Найти цитируемый пост)
код стал правильным только когда я добавил ExitProcess()

Если компилировать прогу с рантаймом (без директивы #pragma comment(linker, "/entry:main")), то всё завершится нормально. А всё потому, что рантайм вызывает ExitProcess. Так что нормально, что вызываешь ExitProcess в чисто винапишной проге.
PM   Вверх
Abyx
Дата 1.8.2010, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 601
Регистрация: 3.11.2009

Репутация: 2
Всего: 10



наверное действительно надо просто не обращать на них внимание, и всегда юзать ExitProcess при закрытии программы

Добавлено через 1 минуту и 17 секунд
586, я знаю что рантайм вызывает ExitProcess  =) 
иногда это очень раздражает, когда хочешь чтобы main() завершилась, а другие потоки продолжали работать
но тут как раз противоположный случай
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0547 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.