monrus
Опытный
Offline
|
|
« : 01-01-2010 06:15 » |
|
Всех с Новым годом!!! Есть прог рамма - ищет среди запущенных окон по первой букве окно. Но работает , если спереди invoke lstrcmp,offset buff,chr$("$Tsk") , если ее убрать , то не находит. Почему? .386 .model flat,stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib ;include find.inc include \masm32\macros\macros.asm
EnumWindowsProc PROTO :DWORD, :DWORD
.data .data?
Wnd dd ? buff db 256 dup(?)
.code
start:
Invoke EnumWindows,offset EnumWindowsProc,0
EnumWindowsProc PROC hwnd:HWND,lParam:LPARAM Invoke GetWindowText,hwnd,offset buff,256 invoke lstrcmp,offset buff,chr$("$Tsk") test eax,eax cmp byte ptr buff,24h ; сравнение с "$" jnz next Invoke MessageBox,0,offset buff,0,0 next: ret EnumWindowsProc ENDP
xor edi, edi invoke ExitProcess, edi ret end start
|
|
« Последнее редактирование: 01-01-2010 09:19 от Sel »
|
Записан
|
|
|
|
darkelf
Молодой специалист
Offline
|
|
« Ответ #1 : 11-01-2010 06:34 » |
|
наверное потому, что в этой функции и происходит сравнение?
|
|
|
Записан
|
|
|
|
Антон (LogRus)
|
|
« Ответ #2 : 12-01-2010 04:06 » |
|
ткни пальцем в строчку, от которой ты ожидаешь получить результат сравнения
|
|
|
Записан
|
Странно всё это....
|
|
|
monrus
Опытный
Offline
|
|
« Ответ #3 : 12-01-2010 13:50 » |
|
хочу чтобы было так: EnumWindowsProc PROC hwnd:HWND,lParam:LPARAM Invoke GetWindowText,hwnd,offset buff,256 cmp byte ptr buff,24h ; сравнение с "$" jnz next Invoke MessageBox,0,offset buff,0,0 next: ret EnumWindowsProc ENDP
|
|
|
Записан
|
|
|
|
darkelf
Молодой специалист
Offline
|
|
« Ответ #4 : 12-01-2010 14:47 » |
|
у меня работает такой пример, правда это для dos, но сути это не меняет. .model small .data
buff db "$Tsk$" msg db "Tsk found$"
.code
start: assume cs:@code,ds:@data mov ax,@data mov ds,ax
cmp byte ptr buff,24h ; сравнение с "$" jnz next mov ah,9 mov dx,offset msg int 21h next: mov ax,4c00h int 21h end start
|
|
|
Записан
|
|
|
|
|
Serg79
|
|
« Ответ #6 : 12-01-2010 19:45 » |
|
Народ, не забываем про кодировку. В DOS одна, в Windows их две UNICODE и ANSI. Так в какой кодировке происходит сравнение первого символа?
|
|
|
Записан
|
|
|
|
darkelf
Молодой специалист
Offline
|
|
« Ответ #7 : 13-01-2010 06:09 » |
|
Serg79, кстати это идея, если GetWindowText возвращает уникодную строку, но тогда надо сравнивать не байт, а слово.. т.е. buff dw 256 dup(?) ... cmp word ptr buff, 24h
|
|
|
Записан
|
|
|
|
Serg79
|
|
« Ответ #8 : 13-01-2010 11:05 » |
|
Да, только в DOS по моему используется ASCII кодировка а в Windows UNICODE и ANSI.
|
|
|
Записан
|
|
|
|
darkelf
Молодой специалист
Offline
|
|
« Ответ #9 : 13-01-2010 11:37 » |
|
в MS-DOS используется cp866, в Windows обычно: в консоли cp866 (OEM), в графике cp1251(ANSI) и Unicode (точнее его разновидность UTF-16), но для всех трёх код символа '$' будет одинаковый (различаются только старшая часть кодовой таблицы для кодов символов >127, куда обычно попадают, для русских кодировок, кириллические буквы и псевдографика), разве что для Unicode код символа будет не байт, а 16-ти разрядное слово.
|
|
« Последнее редактирование: 13-01-2010 11:39 от darkelf »
|
Записан
|
|
|
|
monrus
Опытный
Offline
|
|
« Ответ #10 : 13-01-2010 14:59 » |
|
когда прохожу дебаггером, то видно что идет сравнение $ и $
|
|
« Последнее редактирование: 13-01-2010 15:06 от monrus »
|
Записан
|
|
|
|
darkelf
Молодой специалист
Offline
|
|
« Ответ #11 : 13-01-2010 15:55 » |
|
monrus, и что? не сравнивается?
|
|
|
Записан
|
|
|
|
monrus
Опытный
Offline
|
|
« Ответ #12 : 13-01-2010 16:34 » |
|
так все работает - повторяюсь - если убрать строчку invoke lstrcmp,offset buff,chr$("$Tsk"), то не работает. Хотя бы уж рабочий пример дайте что ли
|
|
|
Записан
|
|
|
|
monrus
Опытный
Offline
|
|
« Ответ #13 : 13-01-2010 18:04 » |
|
все - разобрался: EnumWindowsProc PROC hwnd:HWND,lParam:LPARAM Invoke GetWindowText,hwnd,offset buff,256 cmp byte ptr buff,24h ; сравнение с "$" jnz next Invoke MessageBox,0,offset buff,0,0 mov eax, 0 ret next: mov eax,1 ret EnumWindowsProc ENDP
|
|
|
Записан
|
|
|
|
|