Здравствуйте. Нужно установить собственную 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, и соответственно, откуда восстанавливать прежнюю? Спасибо.
Если эта DLL используется двумя процессами (Ваш exe + exe чужой программы после установки хука), то DLL_PROCESS_ATTACH будет вызван 2 раза. Соответственно, DLL_PROCESS_DETACH - тоже. Dll, раз окно создаётся этой самой DLL.
Это я учёл, но по незнанию не учёл следующего: 1. При вызове DllMain по нужде моего exe, изменить WndProc чужого окошка не получится 2. dll не всегда выгружается сначала из чужого процесса, а уже потом из моего (вот даже не предполагал, что такое может быть). В совокупности эти незнания породили вот такой кусок бреда: Код (Text): ... DLL_PROCESS_DETACH: cmp oldWndProc, 0 jz _EXIT push oldWndProc push -4 push hWnd call SetWindowLongA@12 [b]mov oldWndProc, 0[/b] ... Разумеется программа падала если сначала библиотека отключалась от моего процесса, а уже потом от чужого.