Как известно ,многие "полезные" r-3 утилиты существуют в виде dll . Которая привязывается к чужому процессу , например iexplorer.exe . Азмъ уже прочел главы Рихтера , насчет длл . Но не могу измыслить метода , которым они там существуют . Ведь , как помню , после вызова dll приостанавливаются ВСЕ треды , до окончания DllMain . И , стало быть , реализовать цикл нельзя , ибо повиснет процесс . Мыслю , что можно поставить локальных хуков , и из них вызывать функции dll в случае событий. Но всеравно не ясно , как сделать функционал , который требует циклов . Например если открыть сокет , тогда его нужно постоянно опрашивать , черт знает как . Я чего-то упустил в картине мира , или все так и есть и нужно извращаться с хуками ?
Т е таки не все останавливаются ? Ну значит не так понял великого Рихтера . Извратил писание его . Сделал ложью слова истины его . Благодаствую , досточтимый брат в asm'e , rain. Ты двумя строками отвратил меня от ереси .
Насколько помню у Рихтера было о том что нельзя вызывать из DllMain функции, которые могут потребовать подгрузку других DLL. Соотвественно CreateThread к ним не относится, ибо она сидит в kernel32.dll которая уже загружена. А уже в функции треда таких ограничений нет.
Код (Text): int WINAPI DllMain( HANDLE, DWORD, LPVOID ) { __asm int 3; HMODULE hDll = LoadLibrary("comctl32.dll"); return TRUE; } все нормально
Заранее извиняюсь за большой объём цитирования, но, вряд ли у меня получится сказать лучше автора. Код (Text): BOOL WINAPI DllMain(HINSTANCE hinstDll, DWORD fdwReason. LPVOIO flmpLoad) { HANDLE hThread; DWORD dwThreadld; switch (fdwReason) { case DLL_PROCESS_ATTACH: // DLL проецируется на адресное пространство процесса // создаем поток для выполнения какой-то работы hThread = CreateThread(NULL, 0, SomeFunction, NULL, 0, &dwThreadId); // задерживаем наш поток до завершения нового потока WaitForSingleObject(hThread,INFINITE); // доступ к новому потоку больше не нужен CloseHandle(hThread); break; case DLL_THREAD_ATTACH: // создается еще один поток brеак; case DLL_THREAD_DETACH: // поток завершается корректно break; case DLL_PROCESS_DETACH: // DLL выгружается из адресного пространства процесса break; } return(TRUE); }
roman_pro Здесь кодер сам себе злобный буратино, а не козни системы. Да и цитата эта к вопросу о создании потока в DllMain, а не к LoadLibrary.
IceStudent По поводу LoadLibrary меня проглючило, ибо помнил только что вызовы DllMain упорядочиваются. Вот теперь освежил память и понял что ничего преступного в LoadLibrary в DllMain нет, для чистоты совести проверил - всё грузится. Так что иногда лишняя информация только вредит
Тут видимо дело в том, что LoadLibrary вызывает DllMain, и не возвращается пока DllMain не отработает. Поэтом исходя из этого блокировок быть не должно. Хотя вполне возможно, что все намного сложней.