не видны глобальные переменные
От: loggik  
Дата: 03.02.13 12:10
Оценка: :)
Привет всем.

Есть dll с экспортными функциями, которую будут подключать стороннее приложение. В одной экспортной функции ставиться хук на мышь. При этом запоминается сам дескриптор хука, и другие необходимые переменные. Но когда хуковая функция срабатывает, оказывается что нужные глобальные переменные равны нулю. При этом даже вывод в общую секцию данных не помогает. Описываю все параметры

Переменные
#pragma data_seg(".shared")
HWND hwndWin = NULL;
HHOOK hHook = NULL;
#pragma data_seg()
#pragma comment(linker, "/section:.shared,RWS")


def file
LIBRARY

SECTIONS
 .shared READ WRITE SHARED
 
EXPORTS
    SetHook


вызов и сама хуковая функция
hHook = SetWindowsHookEx(WH_MOUSE, HookProc, hIns, dwThreadId);

LRESULT CALLBACK HookProc (int nCode, WPARAM wParam, LPARAM lParam ) {


лог, сначала идет место где запись, потом имя переменной, потом значени. hm — hmodule, hwnd переменная
DllMain. hm: 138936320, hwnd: 0
SetHook. hm: 138936320, hwnd: 590988
DllMain. hm: 186384384, hwnd: 0
HookProc. hm: 186384384, hwnd: 0


в SetHook запомнился hwnd, но в HookProc он равен 0.

Буду благодарен за помощь в решении. Спасибо.
Re: не видны глобальные переменные
От: Mr.Delphist  
Дата: 14.02.13 11:44
Оценка:
Здравствуйте, loggik, Вы писали:

L>в SetHook запомнился hwnd, но в HookProc он равен 0.


Классическая ситтуация с хуками: надо помнить, что
1) DLL не имеет собственного адресного пространства
2) экземпляров DLL может быть несколько (даже если hInstance совпадает)

Т.е. получается, что первый инстанс DLL запомнил hwnd, но эта переменная хранится в памяти процесса P1. Затем стреляет HookProc, но это происходит к контексте процесса P2 (у которого тоже есть аналогичная переменная, но там пока нуль или мусор).
Чтобы такого избежать, обычно делают inter-process communication (обычно через shared memory). И, если не изменяет память, можно ещё при сборке флаги специальные задать, тогда будет та же shared memory, но прозрачно для программиста (секция данных будет загружена в специально созданную для этого shared memory или как-то так) — но лично никогда на это не заморачивался, дабы не усложнять сборку.
Re: не видны глобальные переменные
От: Alexander G Украина  
Дата: 19.03.13 15:42
Оценка:
Советую смотреть в каком-либо PE-просмотрщике, получилась ли отдельная секция, и расшарена ли она.

Так у меня работает:
#pragma section("shareddata",read,write,shared)

__declspec(allocate("shareddata")) HWND hwndWin = NULL;


> HHOOK hHook = NULL;


Если вы не откопали где-то Windows 98, это не нужно — в первый параметр CallNextHookEx можно передавать NULL.
Русский военный корабль идёт ко дну!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.