Несколько hook в одном процессе
От: c0deC Украина  
Дата: 29.09.09 12:48
Оценка:
Доброго времени суток!

Столкнулся со следующей проблемой и не могу пока решить.

В своей программе, я использую две dll с хуками (внутри себя они вызывают WIN API — SetWindowsHookEx). По отдельности они подгружаются и работают хорошо, а когда запускаешь сначала один dll с hook, а потом другую dll с hook, нормально работать перестают.
На сколько я понимаю, последняя dll с hook становится поверх предыдущей и не даёт ей нормально работать.
Вопрос в том как мне тогда корректно обрабатывать данные от двух загруженных библиотек с hook-ами. Как их загружать и выгружать что бы они не мешали друг другу.

dll написаны правильно и вопросов не вызывают всё по теории. А вот совместная работа таких dll уже не получается.

Если кто-то что-то подобное делал напишите, пожалуйста.
Re: Несколько hook в одном процессе
От: Pavel Dvorkin Россия  
Дата: 30.09.09 07:05
Оценка:
Здравствуйте, c0deC, Вы писали:

C>Доброго времени суток!


C>Столкнулся со следующей проблемой и не могу пока решить.


C>В своей программе, я использую две dll с хуками (внутри себя они вызывают WIN API — SetWindowsHookEx). По отдельности они подгружаются и работают хорошо, а когда запускаешь сначала один dll с hook, а потом другую dll с hook, нормально работать перестают.

C>На сколько я понимаю, последняя dll с hook становится поверх предыдущей и не даёт ей нормально работать.

Понтятие "поверх предыдущей" к DLL неприменимо. А вот к хукам — очень даже. Хуки-то одного и того же типа ? Если да, и в той, которая загрузилась позже, не всегда вызывается CallNextHookEx, то так и должно быть — все более ранние хуки этого же типа управление не получат.
With best regards
Pavel Dvorkin
Re[2]: Несколько hook в одном процессе
От: c0deC Украина  
Дата: 30.09.09 07:58
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Понтятие "поверх предыдущей" к DLL неприменимо. А вот к хукам — очень даже. Хуки-то одного и того же типа ? Если да, и в той, которая загрузилась позже, не всегда вызывается CallNextHookEx, то так и должно быть — все более ранние хуки этого же типа управление не получат.


В данном случае одного типа — WH_GETMESSAGE. А что, если сделать другого типа, то будут работать нормально?
Почему спрашиваю? Недавно возился с hook-ами разных типов и опять таки в одном процессе они нормально не работали, симптомы те же что и сейчас (то глючит что то, то вообще не отвечает) по отдельности отлично работает. Так что выход только один, создавать для кажlой dll с hook отдельный процесс?
Re[3]: Несколько hook в одном процессе
От: Pavel Dvorkin Россия  
Дата: 30.09.09 11:11
Оценка:
Здравствуйте, c0deC, Вы писали:

C>В данном случае одного типа — WH_GETMESSAGE. А что, если сделать другого типа, то будут работать нормально?


Я не вижу ответа на мой вопрос — всегда ли там вызывается CallNextHookEx. Это самое существенное. Делать другого типа незачем, у каждого типа хуков свое назначение. Надо ошибку найти.

C>Почему спрашиваю? Недавно возился с hook-ами разных типов и опять таки в одном процессе они нормально не работали, симптомы те же что и сейчас (то глючит что то, то вообще не отвечает) по отдельности отлично работает. Так что выход только один, создавать для кажlой dll с hook отдельный процесс?


Хуки общесистемные или потоковые ? Общесистемные хуки работют в системе, им до процессов дела нет, поэтому какие процессы их ставят — несущественно. Потоковые хуки работают в потоке, им до процесса тоже дела нет, но если в процессе один поток, то как бы и в процессе
With best regards
Pavel Dvorkin
Re[4]: Несколько hook в одном процессе
От: c0deC Украина  
Дата: 30.09.09 13:32
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Я не вижу ответа на мой вопрос — всегда ли там вызывается CallNextHookEx. Это самое существенное. Делать другого типа незачем, у каждого типа хуков свое назначение. Надо ошибку найти.


Вызывается везде, как по мне.

Вот первая dll
--------------------------------------------------------------------

MYHOOKDLL_API int SetHook1 (HWND hWnd, UINT UpdateMsg)
{
    if(hWnd == NULL)
        return -1;
    
       .............................
    
    // Set hook
    if(!hMsgHookKey)
    {
        hMsgHookKey= ::SetWindowsHookEx (WH_GETMESSAGE, GetMsgProc1, hInstance, 0);    
        if (hMsgHookKey == NULL)
            return -1;
    }
    
    return 0;
}

LRESULT CALLBACK GetMsgProc1(int code, WPARAM wParam, LPARAM lParam)
{
    if (code >= 0)
    {
        MSG *msg = (MSG *)lParam;
        
               .................................
        
    }
    
    
    return CallNextHookEx (hMsgHookKey, code ,wParam , lParam);
}



------------------------------------------------------------------------------
вот вторая dll


MYHOOKDLL_API int SetHook2 (HWND hWnd, UINT UpdateMsg)
{
        ..............................

    if (fInstall)
    {        
        
        // set hook
        g_hhook = SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc2, hInstance, 0);

        .............................
    }
}

static LRESULT WINAPI GetMsgProc2(int code, WPARAM wParam, LPARAM lParam)
{
   return(CallNextHookEx(g_hhook, code, wParam, lParam));
}



PD>Хуки общесистемные или потоковые ? Общесистемные хуки работют в системе, им до процессов дела нет, поэтому какие процессы их ставят — несущественно. Потоковые хуки работают в потоке, им до процесса тоже дела нет, но если в процессе один поток, то как бы и в процессе


Хуки общесистемные. И ещё попробовал пока ждал ответа, сделать запуск этих хуков из разных процессов — работают хорошо не глючат и не мешают друг другу. Если вызываю SetHook1 SetHook2 из одной программы начинаются глюки — пишет то стек переполнен то системные ошибки вылетают то ещё что то. Значит всё таки как то процесс влияет но то откуда hook запущен.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.