Доброе время суток! Если прописать сюда HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\ShellServiceObjectDelayLoad свою длл, наблюдаю странную картину. После перезагрузки, она подгружается в explorer.exe, висит в нем некоторое время(примерно 3 минуты), а после насильно почему-то выгружается из этого процесса. Сама длл в ф-ии DllMain имеет такой код: Код (Text): char moduleName[MAX_PATH]; BOOL bExpFlag=false; g_hInst=hInstance; GetModuleFileName(NULL,moduleName,MAX_PATH); strlwr(moduleName); if (strstr(moduleName,"explorer.exe")!=NULL) bExpFlag=true; //char szReason[500]; //sprintf(szReason,"reason=%d,module=%s",dwReason,moduleName); //MessageBox(NULL,szReason,"app",MB_OK); if (dwReason == DLL_PROCESS_ATTACH) { if (bExpFlag) { UINT uID; HANDLE hTh; hTh=(HANDLE)_beginthreadex(NULL,0,SomeThread,(void*)0,0,&uID); CloseHandle(hTh); } _Module.Init(ObjectMap, hInstance, &LIBID_PPCLib); // модуль также выступает как КОМ объект DisableThreadLibraryCalls(hInstance); } else if (dwReason == DLL_PROCESS_DETACH){ _Module.Term(); } return TRUE; // ok Ф-я SomeThread проста: Код (Text): unsigned WINAPI SomeThread(void*p){ Sleep(INFINITE); } Кто-то может прояснить сию ситуацию? Возможен ли вариант, что оболочка выгружает ненужные (те что не имеют активности определенное время) модули? Или я напортачил в коде что-то?
как вариант создайте невидимое окно и, пока будет крутится оконная процедура, эксплорер её не выгрузит
В общем если создать невидимое окно НЕ В ПОТОКЕ, десктоп зависает. Если создать в потоке и крутить цикл его сообщений, - повторяется то же самое - примерно 5 минут и длл моя выгружается. Кто-нибудь еще сталкивался с таким поведением?
Немного не в тему, но проблема тоже связана с explorer.exe и с самодеятельностью! системы связанной с ним... Я когда заменяю его своим файлом, то через какое то время он восстанавливается... ни кто не знает, с чем это может быть связано ? Есть небольшая идея занять его(мой файл)(например открыть из другого процесса), чтобы система не смогла его удалить. daddyru может бред, но может он засёк что твой тред выполняет бесполезную работу ? К стати останавливается тред или именно библиотека выгрудается (Выполняется обработка DLL_PROCESS_DETACH) ?
Twister Собственно окошко можно в потоке создать и сразу запустить в этой ф-ии потока цикл сообщений. А можно создать сразу в DllMain, без потока. Если бы мне потребовалось создать свой exe модуль и в нем окошко создать, - то тогда потоки создавать не нужно, а сразу в WinMain окно создать и цикл запустить... Не понятно, почему именно так explorer.exe подгружает с ветки ShellServiceObjectDelayLoad длл-ки, что они в обязательном порядке требуют потока при условии наличия окошка и его цикла мессаджей. Почему-то бы ему не позаботиться о том, чтобы каждую длл в отдельном потоке грузить... _s4 Вот именно по прошествии некоторого времени посылается DLL_PROCESS_DETACH. По поводу бесполезной работы - ну тут спорный вопрос. Моя длл в потоке в бесконечном цикле ожидает нотификаций от реестра (ф-я RegNotifyChangeKeyValue). Для меня это полезная работа, а какой ее считает оболочка - тут надо дяди Билла спросить пс. Вот те модули, которые по умолчанию подгружены через упомянутый ключ реестра, как то: stobject.dll, shell32.dll, webcheck.dll - они висят и не выгружаются )))