Сабклассинг

Тема в разделе "WASM.BEGINNERS", создана пользователем Everon, 5 авг 2006.

  1. Everon

    Everon Ronny

    Публикаций:
    0
    Регистрация:
    5 авг 2006
    Сообщения:
    8
    Здравствуйте.

    Нужно установить собственную WndProc для дочернего окна чужой программы. Я создал два модуля - dll и exe. В exe происходит только вызов функции SomeProc из dll. В SomeProc находится то, что обычно делают в WinMain (создание окна, цикл обработки сообщений и т.д.). По приходу WM_CREATE, ищу хэндл нужного окна и устанавливаю на его поток хук WH_CALLWNDPROC (убираю его по WM_DESTROY). В DllMain, по DLL_PROCESS_ATTACH, устанавливаю свой WndProc нужному окну (по DLL_PROCESS_DETACH возвращаю всё на свои места). Всё вроде бы работает, но при завершении моей программы, чужая "падает", но что интересно - не всегда. То есть SetWindowLong иногда не может установить старую WndProc. GetLastError говорит ERROR_ACCESS_DENIED. Вот не пойму почему.

    Кроме того, хотелось бы попросить некоторые общие рекомендации по этому вопросу. А именно:

    1. При создании и регистрации класса окна из dll, лучше использовать hInstance самой dll или же exe? Или не важно?
    2. Откуда, в данном случае, лучше ставить хук, и откуда его удалять?
    3. Откуда устанавливать свою WndProc, и соответственно, откуда восстанавливать прежнюю?

    Спасибо.
     
  2. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Если эта DLL используется двумя процессами (Ваш exe + exe чужой программы после установки хука), то DLL_PROCESS_ATTACH будет вызван 2 раза. Соответственно, DLL_PROCESS_DETACH - тоже.

    Dll, раз окно создаётся этой самой DLL.
     
  3. Everon

    Everon Ronny

    Публикаций:
    0
    Регистрация:
    5 авг 2006
    Сообщения:
    8
    Это я учёл, но по незнанию не учёл следующего:
    1. При вызове DllMain по нужде моего exe, изменить WndProc чужого окошка не получится
    2. dll не всегда выгружается сначала из чужого процесса, а уже потом из моего (вот даже не предполагал, что такое может быть).
    В совокупности эти незнания породили вот такой кусок бреда:
    Код (Text):
    1. ...
    2. DLL_PROCESS_DETACH:
    3.  cmp oldWndProc, 0
    4.  jz  _EXIT
    5.  push oldWndProc
    6.  push -4
    7.  push hWnd
    8.  call SetWindowLongA@12
    9.  [b]mov oldWndProc, 0[/b]
    10. ...
    Разумеется программа падала если сначала библиотека отключалась от моего процесса, а уже потом от чужого.