Я чето не так понял? ;)

Тема в разделе "WASM.BEGINNERS", создана пользователем spa, 11 апр 2009.

  1. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    Значит ситуация такая, ставлю хук (пока на блокнот). Хук работает нормально, все прекрасно, все замечательно, но как только завершаеться приложения в контексте которой был поставлен хук, то он магическим образом снимаеться, при этом dll остаеться в памяти. Сейчас покажу на коде
    Код (Text):
    1. extern "C" __declspec(dllexport) void SetHook()
    2. {
    3.     DWORD t=0;
    4.     HHOOK y=0;
    5.     HWND wh=FindWindow(0,L"Безымянный - Блокнот");
    6.     t =  GetWindowThreadProcessId(wh,NULL);
    7.    
    8.     if(t)  y=SetWindowsHookEx(WH_CALLWNDPROC,  CallWndProc,   Module,   t);
    9.         if(!y) error(0,"SetWindowsHookEx");
    10.     SendMessage( wh, WM_NULL, 0, 0);
    11. }
    Это экспортируемая функция, собсно которую и надо вызывать чтобы поставить хук.


    Код (Text):
    1. LRESULT CALLBACK CallWndProc(int nCode, WPARAM wParam,  LPARAM lParam)
    2. {
    3.         mes(0,"CallBack","nCode");
    4. return (int)CallNextHookEx(0, nCode, wParam, lParam);
    5. }
    Обработка сообщений, идет как надо, пока создавшиее хук приложение работает. Для тех кто хочет спросить почему 0 в первом пораметре CallNextHookEx, превиду цитату из мсдн Windows NT/XP/2003: Ignored.

    Код (Text):
    1.     HMODULE t= LoadLibrary(L"Spa.dll");
    2.     SetHook=(vfunk)GetProcAddress(t,"SetHook");
    3.     SetHook();
    4.     MessageBox(0,L"Sleep",L"Sleep",0);
    Это код приложения (ЕХЕ) которое ставит хук. Собсна после того кок мы нажимает Ок на мессаджбокс, все хук таинствено останавливаеться, и наша процедура обработки больше не получает управление
     
  2. bendme

    bendme New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2009
    Сообщения:
    179
    Когда приложение закрывается - освобождаются все ресурсы, выделенные процессом: объекты ядра, библиотеки итд. Также все хуки анхучиваются.

    Представь, если бы твоя прога понаставила бы кучу хуков, а потом грохнулась, и при этом все хуки бы остались?
     
  3. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    bendme
    Ну вообщето хотелось бы чтобы да все хуки остались. ВЫход то я давно предумал, можно ставить хук, контексте нового процесса создавать еще 1 а тот убивать, но это какойто черезпопный метод. Есть еще варианты?

    Вообще хочу заметить что библиотека в памяти блокнота осталась... так что о каком сохранении ресурса идет речь ))

    add

    Пожалуй сразу скажу что предлагать всякие разные варианты инжекта длл не стоит. Хуки понятно дела не единственный способ, просто я не думал что хуки тоже анхучаться ((
     
  4. bendme

    bendme New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2009
    Сообщения:
    179
    > Вообще хочу заметить что библиотека в памяти блокнота осталась... так что о каком сохранении ресурса идет речь ))

    А у меня библиотека успешно выгружается из памяти. Только что проверял. Правда, я пользуюсь неявной загрузкой dll.
     
  5. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    Код (Text):
    1.     case DLL_PROCESS_ATTACH:
    2.     Module = hModule;
    3.         if(hh)
    4.     {
    5.         UnhookWindowsHookEx(hh);
    6.         hh=0;
    7.  
    8.         if(!SetWindowsHookEx(WH_GETMESSAGE,  CallMsgProc,   hModule,   t))
    9.             error(0,"SetWindowsHookEx");
    10.         SendMessage( wh, WM_NULL, 0, 0);
    11.     }
    12.     break;
    Сдесь вы можете наблюдать как я ставлю 1 хук и убираю другой. Все нормально работает. ХОчу обратить ваше внимание что теперь я ставлю WH_GETMESSAGE хочу профильтровать некоторые сообщения.

    Но чтоже полчаю в итоге.
    Код (Text):
    1. 0x00000118
    2. WM_NCLBUTTONDOWN
    3. WM_LBUTTONUP
    4. WM_QUIT
    Те явно приходят не все сообщения. К примеру я хочу перед закрытием блокнота выдать какоето сообщения, но не могу WM_QUIT , приходит уже когда пора закрывать приложение.
     
  6. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    Естественно я привел толклько последниее собщения ,перед закрытием.


    ЗЫ так на всякий случай сказал.
     
  7. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    SetWindowsHookEx(WH_GETMESSAGE... ставит хук на очередь сообщений, а через неё идут далеко не все сообщения - многие передаются прямым вызовом оконной функции, кстати даже SetWindowsHookEx(WH_CALLWNDPROC... не всегда достаточно
     
  8. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    Y_Mur
    WH_CALLWNDPROC Мне бы хватило, но как не дать закрыться программе, я ведь не могу не пропустить собщения.
     
  9. bendme

    bendme New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2009
    Сообщения:
    179
    В смысле?

    Ловишь сообщение WM_CLOSE хуком -> выполняешь то, что тебе надо -> потом вызываешь Callnexthook.

    Если WM_CLOSE у тебя не ловится- тогда подмени функцию wndproc с помощью setwindowlong и уже там лови WM_CLOSE.
     
  10. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    И программа закрываеться. Ну понятно что я могу и не вернуть, но как я понял отфильтровывать сообщения можно только WH_GETMESSAGE. Ну да ладно ща проверю
     
  11. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    Одтверждаю свою догадку. Приложение хакрываеться. Так нарисовалась проблемма я не могу юзать SetWindowLong так придожении с которым я работаю, создает массу окон, а WM_CLOSE присылаеться тоолько активному окну, а оно может создаваться и динамически. Конечно у меня как всегда есть черезпопный метод, но хотелось бы услышать ваши предложения.
     
  12. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    SetClassLong(... GCL_WNDPROC...
    Replaces the address of the window procedure associated with the class.
     
  13. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    Y_Mur
    О сенк, я думаю оно мне подойдет.

    PS ушел тестить
     
  14. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    Y_Mur
    Ан не то, я рано обрадовался. Там проблемма в том что у каждого окна своя функция обработки!!, как следствие этот способ не катит. Я пока решил так делать, ловить активацию окна ставить на активное окно новый обработчик, как меняеться опять, тот снимать новый ставить. Способ как говориться не ахти, но в голову нечего не лезит получше ((