![]() |
Quote:
Пробовал размещать в виде: Code:
extern LRESULT CALLBACK FuncName()Code:
hkprcSysMsg = (HOOKPROC)GetProcAddress(hinstDLL, "FuncName")---------- Post added at 18:35 ---------- Previous post was at 18:34 ---------- Quote:
---------- Post added at 18:48 ---------- Previous post was at 18:35 ---------- Quote:
|
Если добавить в код DLL такие строки:
Code:
#define EXPORT extern "C" __declspec(dllexport)Code:
typedef int (__cdecl* int_DllFun_void)( void );Проблема экспорта функций из DLL в том, что для каждой разновидности экспортируемых функций нужно иметь правильный тип ( выделен синим ). Красным выделены тип возвращаемого значения и типы аргументов экспортируемой функции. ---------- Post added at 18:01 ---------- Previous post was at 17:55 ---------- Quote:
|
Quote:
---------- Post added at 19:04 ---------- Previous post was at 19:01 ---------- Да, с extern "C" __declspec(dllexport) получилось, а с __declspec(dllexport) не получалось. ---------- Post added at 19:13 ---------- Previous post was at 19:04 ---------- Quote:
Попробовал подключить твою либу к своему эмулятору, при открытии ее (а следовательно и при инициализации еешного хука), все так же начинает глючить, как и при собственном хуке, который был в .exe. Т.е. при активном окне эмулятора все окей, при активном окне консоли - тормоза и невызывание хука (в лог ничего не пишется). Но тут я вспомнил твои слова о том, что при отсутствии опроса сообщений хук не работает. И таки да - в режиме консоли у меня сообщения, идущие эмулятору не опрашиваются. Т.е. они опрашиваются, но только когда выполняется какая-либо команда консоли. Значит собака зарылась здесь, и надо понять КАКИМ образом тормоза и глюки хуков зависят от невызывания разбора сообщений. ---------- Post added at 19:28 ---------- Previous post was at 19:13 ---------- Причем, хук, запущенный в другой программе (например тесте хуков) работает исправно. |
Quote:
---------- Post added at 19:08 ---------- Previous post was at 19:04 ---------- Можно запускать хук в отдельном потоке со своим разборщиком сообщений - это самое простое решение, которое "уравнивает в правах" поток хука с хуком во внешнем процессе. |
Quote:
|
Код потока хука может выглядеть так:
Code:
dword WINAPI HookThread( LPVOID pArg )Code:
HANDLE hHookThread = CreateThread( NULL, 0, HookThread, NULL, 0, NULL );---------- Post added at 19:17 ---------- Previous post was at 19:17 ---------- Quote:
|
Немножко поэкспериментировал.
Все застревает на функции PeekMessage(), если она не вызвана вовремя. Я думаю так: если процесс не отвечает на сообщения, то он считается зависшим, и хук, находящийся в экзешнике этого процесса отключается. Если процесс снова начинает отвечать на сообщения, то хук восстанавливается, но с небольшой задержкой. Эта задержка внутри PeekMessage и подтормаживает систему. |
Хотя, наверняка, потоку хука можно делать блокирующий вызов GetMessage вместо не блокирующего вызова PeekMessage. Есть смысл сначала сделать с PeekMessage и Sleep(1), а потом с GetMessage.
|
Quote:
---------- Post added at 20:34 ---------- Previous post was at 20:23 ---------- Ура! Вот в таком виде прекрасно работает и не виснет: Code:
UINT32 WINAPI HookThread(LPVOID pArg)Как убить созданный поток, послав ему честный WM_QUIT? |
Quote:
|
| All times are GMT +4. The time now is 02:42. |
Powered by vBulletin® Version 3.8.3
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.