Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Помогите с побуквенным сравнением  (Прочитано 15764 раз)
0 Пользователей и 1 Гость смотрят эту тему.
monrus
Опытный

ru
Offline 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
Молодой специалист

no
Offline Offline

« Ответ #1 : 11-01-2010 06:34 » 

наверное потому, что в этой функции и происходит сравнение?
Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #2 : 12-01-2010 04:06 » 

ткни пальцем в строчку, от которой ты ожидаешь получить результат сравнения
Записан

Странно всё это....
monrus
Опытный

ru
Offline 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
Молодой специалист

no
Offline 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
Записан
monrus
Опытный

ru
Offline Offline

« Ответ #5 : 12-01-2010 16:46 » 

согласен - тогда почему не работает у меня - вот в чем вопрос Улыбаюсь
Записан
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 12-01-2010 19:45 » 

Народ, не забываем про кодировку. В DOS одна, в Windows их две UNICODE и ANSI. Так в какой кодировке происходит сравнение первого символа?
Записан
darkelf
Молодой специалист

no
Offline Offline

« Ответ #7 : 13-01-2010 06:09 » 

Serg79, кстати это идея, если GetWindowText возвращает уникодную строку, но тогда надо сравнивать не байт, а слово.. т.е.
Код:
buff dw 256 dup(?)
...
cmp word ptr buff, 24h
Записан
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #8 : 13-01-2010 11:05 » 

Да, только в DOS по моему используется ASCII кодировка а в Windows UNICODE и ANSI.
Записан
darkelf
Молодой специалист

no
Offline 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
Опытный

ru
Offline Offline

« Ответ #10 : 13-01-2010 14:59 » 

когда прохожу дебаггером, то видно что идет сравнение $ и $

* 20100113-210335_cr.png (55.43 Кб - загружено 869 раз.)
« Последнее редактирование: 13-01-2010 15:06 от monrus » Записан
darkelf
Молодой специалист

no
Offline Offline

« Ответ #11 : 13-01-2010 15:55 » 

monrus, и что? не сравнивается?
Записан
monrus
Опытный

ru
Offline Offline

« Ответ #12 : 13-01-2010 16:34 » 

так все работает - повторяюсь - если убрать строчку invoke lstrcmp,offset buff,chr$("$Tsk"), то не работает.
Хотя бы уж рабочий пример дайте что ли Улыбаюсь
Записан
monrus
Опытный

ru
Offline 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
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines