data_seg и общая переменная

Тема в разделе "WASM.WIN32", создана пользователем beginner, 26 ноя 2008.

  1. beginner

    beginner New Member

    Публикаций:
    0
    Регистрация:
    18 янв 2008
    Сообщения:
    233
    Здравствуйте
    Углубляю знания по хукам. Есть такой вот вопрос.
    Перехватываю все сообщения в каком то процессе, и передаю их в свой процесс через очередь сообщений
    для этого создал невидимое окно в основном процессе.
    В этом же основном процессе есть такой код:
    Код (Text):
    1. HMODULE hLib = LoadLibrary("mydll.dll");
    2. dllFunc = (DLLFUNC) GetProcAddress(hLib, "myFunc");
    3. dllFunc(hWnd); // хендл окна, куда нужно слать перехваченные сообщения, где я их потом обрабатываю.
    в Dll есть вот такой вот код:
    Код (Text):
    1. #pragma data_seg(".SHDATA")
    2. HWND hWndMain = NULL;
    3. #pragma data_seg ()
    4. #pragma comment(linker, "/SECTION:.SHDATA,RWS")
    5.  
    6. void myFunc (HWND hWnd) {
    7.     hWndMain = hWnd;
    8.     MessageBox(NULL, "HWND its SET!", "message from dll", MB_OK);
    9. };
    экспорт, все дела - все настроено и прописано. В принципе, все сообщения ко мне идут нормально, я вижу что я нажимал, но пока проверял на одном лишь калькуляторе.
    Собственно вопрос:
    Когда я перед установкой хука вызываю функцию myFunc, что бы она установила нужный мне хендл окна. Я потом запускаю калькулятор и на его поток устанавливаю хук. Нажимаю кнопки на калькуляторе, сообщения приходят ко мне. Если я запущу еще один-два-три новых процесса и на них так же поставлю хук, то мне ж не надо заново устанавливать хендл окна, куда слать сообщения? Так как сегмент является общий для всех экземпляров длл, то изменения, которые я сделал один раз - сразу отобразятся во всех копиях длл? Правильно я понял теорию?

    Меня просто смущает строка "HWND hWndMain = NULL;" Получается, она выполняется только один раз при первой загрузке длл?
     
  2. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    beginner
    > не надо заново устанавливать хендл окна
    Достаточно одного раза.. Однако проверка на валидность "хэндла" перед отправкой сообщения не помешает.

    > изменения, которые я сделал один раз - сразу отобразятся во всех копиях длл?
    Да.

    > смущает строка "HWND hWndMain = NULL;" Получается, она выполняется только один раз при первой загрузке длл?
    Это строка "выполняется" на этапе сборки, т.е. после работы редактора связей dll'ка будет содержать секцию, в которой будет размещена _уже_инициализированная_ переменная.
     
  3. beginner

    beginner New Member

    Публикаций:
    0
    Регистрация:
    18 янв 2008
    Сообщения:
    233
    q_q
    спасибо за разъяснения!!!
    проверку хендла на валидность сделаю.