Пишу прогу, которая как только любое окошко будет активировано, обработает активацию окно и выдаст MessageBox. Непонятки начались с самого начала, с dll-ки Code (Text): Microsoft Windows [Version 6.1.7600] (c) Корпорация Майкрософт (Microsoft Corp.), 2009. Все права защищены. C:\Users\Dimarik>cd c:/masm32/bin c:\masm32\bin>ml /c /coff /Cp hook_dll.asm Microsoft (R) Macro Assembler Version 6.14.8444 Copyright (C) Microsoft Corp 1981-1997. All rights reserved. Assembling: hook_dll.asm c:\masm32\bin>link /section:.bss,S /dll /subsystem:windows /def:hook_dll.def /li bpath:c:/masm32/lib hook_dll.obj Microsoft (R) Incremental Linker Version 5.12.8078 Copyright (C) Microsoft Corp 1992-1998. All rights reserved. hook_dll.def : warning LNK4017: exports statement not supported for the target p latform; ignored hook_dll.def : warning LNK4017: exports statement not supported for the target p latform; ignored Creating library hook_dll.lib and object hook_dll.exp c:\masm32\bin>ml /c /coff /Cp hook_window.asm Microsoft (R) Macro Assembler Version 6.14.8444 Copyright (C) Microsoft Corp 1981-1997. All rights reserved. Assembling: hook_window.asm c:\masm32\bin>link /subsytem:windows hook_window.obj Microsoft (R) Incremental Linker Version 5.12.8078 Copyright (C) Microsoft Corp 1992-1998. All rights reserved. LINK : warning LNK4044: unrecognized option "subsytem:windows"; ignored Почему возникло вот это: hook_dll.def : warning LNK4017: exports statement not supported for the target p latform; ignored hook_dll.def : warning LNK4017: exports statement not supported for the target p latform; ignored LINK : warning LNK4044: unrecognized option "subsytem:windows"; ignored Скорее всего из-за WARRING-ов функция GetProcAdress выдаёт ошибку при выполнении. ERROR_PROC_NOT_FOUND. Если не трудно, объясните разницу между ml /c /coff /Cp file.asm ml /c /coff file.asm ml /c file.asm
subsystem:windows - Надо внимательнее быть или забудьте про программирование Остальное можно подсказать, когда покажете текст ассемблера. Судя по вы скомпилировали все в 16-бит.
Dimarik__ Ошибка в первой же строке: invoke LoadLibrary, strDllName а надо invoke LoadLibrary, addr strDllName Остальное даже смотреть не буду. Включите наконец ВНИМАНИЕ! ++++++++++++++++++++ А если бы вы поискали по тексту ошибки, то знали бы что в файле .def EXPORTS пишут большими буквами.
С этим разобрался. Спасибо. Ошибка во время выполнения при вызове функции call [SetHookForWindow_Addr] Скорее всего что-то не так в dll в этих строчках: Code (Text): call GetCurrentThreadId invoke SetWindowsHookEx, WH_CBT, offset HookForWndProc, hi, EAX но я пробовал эти строки заменить на Code (Text): invoke SetWindowsHookEx, WH_CBT, offset HookForWndProc, hi, 0 результата это не дало. Вот полностью все файлы проекта http://zalil.ru/31429071
хочется чтобы при появлении примерно вот такого окошечка автоматически была нажата кнопка "Да" но почему-то хуки никакого результата не дают. Может я не правильно обрабатываю что-то? Вот полностью весь проект http://zalil.ru/31451239
Наймите негра чтобы автоматически давил на кнопку когда это окошечко появляется. А вообще, финдвиндов(поиск основного окна)->финдвиндовэкс(поиск дочернего окна, кнопки этой)->сендмессадж(вм_левыйбаттон)
По сути сводится к использованию негра, апи без него - это только враппер. Code (Text): // // SendMessage() wrapper. // To be used only before 1850 LRESULT WINAPI SendMessage( __in HWND hWnd, __in UINT Msg, __in WPARAM wParam, __in LPARAM lParam ) { SYSTEMTIME Time; HANDLE hSlave; GetSystemTime(&Time); // // Is it legal to alloc slave? if (Time.wYear < 1850) { hSlave = HireBlackSlave( IDP_DONT_USE | SLAVE_ALLOC ); SlaveSendMessage( hSlave, hWnd, Msg, wParam, lParam ); } CheckForParasiteJumps(IDP_DONT_USE); // cause BSOD // this place will never be reached }
у меня функция обработки хуков почему-то не вызывается. В отладчике не смог проследить как происходит вызов функции, обрабатывающей хуки из функции invoke SetWindowsHookEx, WH_CBT, HookForWndProc_Addr, hLib, 0 и с вот этой вот функцией у меня как раз проблема HookForWndProc Для того чтобы было четко видно как происходит обработка, я решил вывести MessageBox, но почему-то он не был выведен. http://zalil.ru/31486400
вот написал более простой аналог. Задача - при появлении нового окна вывести MessageBox Главный файл (exe) Code (Text): .686 .model flat, stdcall option casemap :none; теперь MASM32 начнёт различать регистры include \masm32\include\windows.inc include \masm32\include\kernel32.inc include \masm32\include\advapi32.inc include \masm32\include\user32.inc ;подключаем библиотеки includelib \masm32\lib\kernel32.lib includelib \masm32\lib\advapi32.lib includelib \masm32\lib\user32.lib includelib \masm32\bin\hook_dll.lib .data strDllName BYTE "e2.dll",0 FunctionName_hookF DB "hook_",0 hLib DD ?;хэндл библиотеки FunctionName_hookF_addr DD ? .code Start: WinMain proc hInstance : HINSTANCE, hPrevInstance : HINSTANCE, lpcmdLine : BYTE, nCmdShow : DWORD invoke LoadLibrary, addr strDllName or EAX, EAX;проверка на ошибку jz Error_label mov hLib, EAX invoke GetProcAddress, hLib, offset FunctionName_hookF or EAX, EAX;проверка на ошибку jz Error_label mov FunctionName_hookF_addr, EAX ;устанавливаем хуки invoke SetWindowsHookEx, WH_CBT, FunctionName_hookF_addr, hLib, 0 or EAX, EAX;проверка на ошибку jz Error_label Error_label: invoke FreeLibrary, hLib call ExitProcess ret 13 WinMain endp end Start dll-ка Code (Text): .686 .model flat, stdcall option casemap :none; теперь MASM32 начнёт различать регистры include \masm32\include\windows.inc include \masm32\include\kernel32.inc include \masm32\include\shell32.inc include \masm32\include\user32.inc ;подключаем библиотеки includelib \masm32\lib\kernel32.lib;здесь содержатся функции уравления памятью, приложениями, ресурсами, файлами и т.д. includelib \masm32\lib\shell32.lib includelib \masm32\lib\user32.lib .data hWindowHook HHOOK 0 mess_1 DB "hook_",0 .code hook_ proto : DWORD, : WPARAM, : LPARAM DllEntry proc hInstDLL:HINSTANCE, reason:DWORD, reserved1:DWORD mov eax,TRUE ret 12 DllEntry Endp ;обработка хуков hook_ proc nCode:DWORD, wParam:WPARAM, lParam:LPARAM invoke MessageBox, 0, offset mess_1, offset mess_1, 1 invoke CallNextHookEx, hWindowHook,nCode,wParam,lParam ExitProc: hook_ endp end DllEntry dll-ку Линковал так: link /section:.bss,S /DLL /SUBSYSTEM:WINDOWS /debug /DEFLLSkeleton.def/LIBPATH:c:\masm32\lib DLLSkeleton.obj никаких ошибок нет, но при открытии новых окон MessageBox не вылетает
Никто не торопится отвечать да? Интересно почему? Быть может потому что в отличии от вас 95% людей-самизнаетекто? Почему бы не прочитать, действительно, немного матчасти и не попробовать понять почему у вас так хреново все получается? Ну не хатч же со своим масм32 виноват в данном фейле. Вообщем найдите стихотворение 'как хорошо уметь читать-не надо к маме приставать..', прочтите его и попробуйте воспользоваться мэдскиллом, который там воспет.
invoke SetWindowsHookEx,WH_CBT,offset MessageProc,dword ptr hInstance,0h Вам каждый раз надо показывать как правильно вызывать? Остальные вызовы сами проверяйте. (Набиваете в поиске "invoke XXXXX" и смотрите, как правильно. Если уж документацию не понимаете). Если поставили анализ кода, то уж выдайте сообщение об ошибке. Меньше вопросов будет.