Сейчас на форуме: hgdagon, asfa, bartolomeo (+4 невидимых)

 eXeL@B —› Программирование —› Немогу создать окно
Посл.ответ Сообщение

Ранг: 13.0 (новичок)
Активность: 0.010
Статус: Участник

Создано: 08 апреля 2007 18:29
· Личное сообщение · #1

Решил изучить асм под 32 - c MessageBox проблем не возникло=) А вот с созданием окна возникло=( Процесс запускается и висит в памяти но окно не появляется Я решил просмотреть ее из под отладчика RegisterClass возвращает в еах - C149 на код ошибки не похоже=) а вот CreateWindowEx возвращает в еах 0 помогите разобраться.

a5d2_08.04.2007_CRACKLAB.rU.tgz - window.rar



Ранг: 73.1 (постоянный), 130thx
Активность: 0.040.23
Статус: Участник

Создано: 08 апреля 2007 18:39
· Личное сообщение · #2

Пользуй:
.486
.model flat,stdcall
option casemap:none

include windows.inc
include user32.inc
include kernel32.inc
includelib user32.lib
includelib kernel32.lib

.data
ClassName db "XxX",0
AppName db "xXx",0

.data?
wc WNDCLASSEX <>
msg MSG <>

.code
start:
xor ebx,ebx
invoke GetModuleHandle, ebx
mov edi,eax
mov hInst,eax
mov wc.cbSize,SIZEOF WNDCLASSEX
mov wc.style,ebx
mov wc.lpfnWndProc, OFFSET WndProc
mov wc.cbClsExtra,ebx
mov wc.cbWndExtra,ebx
mov wc.hInstance,edi
mov wc.hbrBackground,ebx
mov wc.lpszMenuName,ebx
mov wc.lpszClassName,OFFSET ClassName
mov wc.hIcon,ebx
mov wc.hIconSm,ebx
mov wc.hCursor,ebx
invoke RegisterClassEx, addr wc
invoke CreateWindowEx,ebx,ADDR ClassName,ebx,ebx,ebx,ebx,ebx,ebx,ebx,ebx,edi,ebx
.while TRUE
invoke GetMessage, ADDR msg,ebx,ebx,ebx
.BREAK .IF (!eax)
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
.endw
mov eax,msg.wParam
invoke ExitProcess,eax

WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
xor ebx,ebx
.if uMsg==WM_DESTROY
invoke PostQuitMessage, ebx
.else
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.endif
xor eax,eax
ret
WndProc endp

end start





Ранг: 115.8 (ветеран)
Активность: 0.080
Статус: Участник

Создано: 08 апреля 2007 20:10
· Личное сообщение · #3

iczelion рулит.....

-----
Ни одно доброе дело не должно остаться безнаказанным !!!




Ранг: 23.8 (новичок)
Активность: 0.010
Статус: Участник

Создано: 08 апреля 2007 21:00
· Личное сообщение · #4

А у меня вопрос, почему FASM ругаеться на команду return при компиляции?
Вот пример, кусок кода.

proc window_procedure,hWnd,uMsg,wParam,lParam
push ebx esi edi ;eventhough the API would preserved, but play safe :p
cmp [uMsg],WM_DESTROY
je wmDESTROY

wmDEFAULT:
invoke DefWindowProc,[hWnd],[uMsg],[wParam],[lParam]
jmp wmBYE
wmDESTROY:
invoke PostQuitMessage,0

wmBYE:
pop edi esi ebx
return <--------------------------------- она
endp

section '.idata' import data readable writeable
library KERNEL32, 'KERNEL32.DLL',
USER32, 'USER32.DLL'



Ранг: 13.0 (новичок)
Активность: 0.010
Статус: Участник

Создано: 08 апреля 2007 21:17 · Поправил: satana
· Личное сообщение · #5

[EXE]_cutor пишет:
iczelion
Я по еге статье и пишу=)

RamMerlabs пишет:
Пользуй:
- я сам кому угодно могу исходников дать, помогите ошибку найти и скажите ч сделал не так




Ранг: 105.9 (ветеран)
Активность: 0.060
Статус: Участник

Создано: 08 апреля 2007 22:31 · Поправил: seeq
· Личное сообщение · #6

satana
WndProc proc написана неправильно



Ранг: 73.1 (постоянный), 130thx
Активность: 0.040.23
Статус: Участник

Создано: 08 апреля 2007 23:02
· Личное сообщение · #7

>>я сам кому угодно могу исходников дать, помогите ошибку найти и скажите ч сделал не так
значит тебе не составит труда сравнить мой исходник со своим, проанализировать их и найти ошибку!



Ранг: 73.1 (постоянный), 130thx
Активность: 0.040.23
Статус: Участник

Создано: 08 апреля 2007 23:03
· Личное сообщение · #8

PLAYFCUK
return - это по ходу макрос. Нужно ret.




Ранг: 81.2 (постоянный)
Активность: 0.040
Статус: Участник

Создано: 08 апреля 2007 23:27
· Личное сообщение · #9

RamMerlabs, по-моему хорошо что хоть как нить помогают




Ранг: 81.2 (постоянный)
Активность: 0.040
Статус: Участник

Создано: 08 апреля 2007 23:27
· Личное сообщение · #10

упс я по-ходу ошибся




Ранг: 81.2 (постоянный)
Активность: 0.040
Статус: Участник

Создано: 08 апреля 2007 23:29
· Личное сообщение · #11

это было к satana



Ранг: 495.3 (мудрец)
Активность: 0.30
Статус: Участник

Создано: 09 апреля 2007 00:35
· Личное сообщение · #12

PLAYFCUK пишет:
А у меня вопрос, почему FASM ругаеться на команду return при компиляции?
Вот пример, кусок кода.

Нет такой команды.
Return - это макрос, который ты можешь написать сам или взять готовый.
Если в лом, замени на другой макрос - ret (он входит в стандартный набор).
satana
1. Нафиг ты удалил "option casemap:none"? Этого делать нельзя, так как будут путаться переменные типа hwnd и hWnd. И вообще, все стандартные инклудуы Хатча рассчитаны на чувствительность к регистру.

2. Ошибка у тебя в том, что ты не понимаешь, как работает WndProc.
Её вызывает система (в тривиальном случае только в цикле сообщений и при создании окна!).
Так вот, CreateWindow передаёт сообщение WM_CREATE процедуре окна. Если окно вернуло 0 – то кирдык (создание считается неудачным).
Мало того, DefWindowProc всегда возвращает значение, которое нужно сохранить и передать дальше (значения всегда возвращаются в EAX).
Так что ищи ошибку в процедуре окна.
Всё это в принципе есть в документации, но помню, сам долго врубался, и ничего не помогало кроме экспериментов. В отладчике часами сидел.

-----
Всем привет, я вернулся




Ранг: 13.0 (новичок)
Активность: 0.010
Статус: Участник

Создано: 09 апреля 2007 02:35
· Личное сообщение · #13

Bitfry пишет:
1. Нафиг ты удалил "option casemap:none"?

Я при линковке добавил параметр /Cp



Ранг: 13.0 (новичок)
Активность: 0.010
Статус: Участник

Создано: 09 апреля 2007 02:43
· Личное сообщение · #14

Всем спасибо, нашел ошибку


 eXeL@B —› Программирование —› Немогу создать окно
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати