EnumWindows && EnumChildWindows fail
От: IMFletcher  
Дата: 30.09.05 07:46
Оценка:
Есть маленькая программка. По замыслу тербуется найти окно с классом "#32770" получить 2 hWnd его дочерних окон класса Edit.
.386
.model flat, stdcall
option casemap :none ; case sensitive

include \masm32\include\windows.inc
[skip]
includelib \masm32\lib\user32.lib
[skip]
EnmProc PROTO :DWORD,:DWORD
EnmChProc PROTO :DWORD,:DWORD
.data
CommandLine dd 0
hInstance dd 0
lpfnListProc dd 0
mainclass db '#32770',0
EditClass db 'Edit',0
hMWin dd 0
hEdt1 dd 0
hEdt2 dd 0
Flg db 0
fstr db 'Окно %lx',0
buf db 60 dup (?)
.code
start:
invoke GetModuleHandle, NULL
mov hInstance, eax
invoke GetCommandLine
mov CommandLine, eax
invoke EnumWindows,ADDR EnmProc,0
mov Flg,0
invoke EnumChildWindows,hMWin,ADDR EnmChProc,0
invoke wsprintf,ADDR buf,ADDR fstr,hEdt1
invoke MessageBox,NULL,ADDR buf,NULL,MB_OK
invoke wsprintf,ADDR buf,ADDR fstr,hEdt2
invoke MessageBox,NULL,ADDR buf,NULL,MB_OK
invoke ExitProcess,eax
EnmProc proc eHandle :DWORD, y :DWORD
LOCAL clName[64] :BYTE
invoke GetClassName,eHandle,ADDR clName,64
invoke lstrcmp,ADDR clName,ADDR mainclass
or eax,eax
jnz NextWin
mov ebx,eHandle
mov hMWin,ebx ;POINT 1
jmp @F
NextWin: mov eax, eHandle
@@: ret
EnmProc endp
EnmChProc proc eHandle :DWORD, y :DWORD
LOCAL clName[64] :BYTE
invoke GetClassName,eHandle,ADDR clName,64
invoke lstrcmp,ADDR clName,ADDR EditClass
or eax,eax
jne NextWin1
lea ebx,hEdt1
xor eax,eax
mov al,Flg
add ebx,eax
mov eax,eHandle
mov [ebx],eax
add Flg,4
NextWin1: mov eax, eHandle
ret
EnmChProc endp
end start

Проблема в следующем: в w2k вызов EnumWindows отрабатывает согласно пророчеству, — в hMWin получаем hwnd окна класса #32770 (в SoftIce оно ещё обозначено как Dialog). А вот EnumChildWindows отрабатывает хз как: SoftIce показывает у окна #32770 10 дочерних, что соответствует действительности. Из них 2 Editа. EnumChildWindows находит только 1 Edit и поиск обрывается.
В Win98 программа вылетает по ошибке "Сбой при обращении к странице памяти в user32.dll". Похоже, что ей не нравится строка POINT 1. Вот только c какого перепуга Мож кто знает как сие победить?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.