Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.02.2013, 13:12   #1
IRomanKozlov
Пользователь
 
Регистрация: 24.07.2011
Сообщений: 11
Вопрос не возвращается управление из CreateWindowEx

Помогите пожалуйста найти ошибку (MASM32). Сам долго искал, много раз проверял как заполняются структура WNDPROC и параметры функции CreateWindowEx. Переписывал эту часть программы с чистого листа (с меньшим кол-вом локальных переменных), и она работает... Я в тупике

Код:
.386
.model flat, stdcall
option casemap:none

include D:\masm32\include\windows.inc
include D:\masm32\include\user32.inc
include D:\masm32\include\GDI32.inc
include D:\masm32\include\msvcrt.inc
include D:\masm32\include\kernel32.inc

includelib D:\masm32\lib\user32.lib
includelib D:\masm32\lib\GDI32.lib
includelib D:\masm32\lib\msvcrt.lib
includelib D:\masm32\lib\kernel32.lib
.data
        ...
	szClassName db "ClassX",0
	szTitle db "Main",0
	szMes_1 db "Окно создано", 0
        ...
	
.data?
	hInstance HINSTANCE ?
	lpstr LPSTR ?

.code

start:	
	push NULL
	call GetModuleHandleA		
	mov hInstance, eax
	call GetCommandLineA
	mov lpstr, eax
	
	push SW_SHOWDEFAULT
	push offset lpstr
	push NULL
	push hInstance
	call WinMain		                  ;WinMain
	push eax			
	call ExitProcess
	
WinMain proc
	push ebp
	mov ebp, esp
	sub esp, 0A8h
	
	mov eax, dword ptr [ebp+08h]                                       ;Заполнение структуры WNDCLASSEX. [ebp-68h] : начало структуры
	mov dword ptr [ebp-54h], eax
	mov [ebp-40h], offset szClassName
	mov [ebp-60h], offset WndProc
	mov dword ptr [ebp-64h], CS_HREDRAW or CS_VREDRAW
	mov dword ptr [ebp-68h], sizeof WNDCLASSEX
	
	mov dword ptr [esp+04h], IDI_QUESTION
	mov dword ptr [esp], NULL
	call LoadIconA
	sub esp, 08h
	mov dword ptr [ebp-50h], eax
	
	mov dword ptr [esp+04h], IDI_QUESTION
	mov dword ptr [esp], NULL
	call LoadIconA
	sub esp, 08h
	mov dword ptr [ebp-3Ch], eax
	
	mov dword ptr [esp+04h], IDC_ARROW
	mov dword ptr [esp], NULL
	call LoadCursorA
	sub esp, 08h
	mov dword ptr [ebp-4Ch], eax
	
	mov dword ptr [ebp-44h], NULL
	mov dword ptr [ebp-5Ch], NULL
	mov dword ptr [ebp-58h], NULL
	mov dword ptr [ebp-48h], COLOR_WINDOW+1
	
	lea eax, dword ptr [ebp-68h]
	mov dword ptr [esp], eax
	call RegisterClassEx                                                ;RegisterClassEx
	sub esp, 04h

	test ax, ax	
	jne Label16	                                                          ;Регистрация класса проходит устпешно!
	mov dword ptr [ebp-70h], 00000000h
	jmp Label17	
Label16:	
	mov dword ptr [esp+2Ch], NULL                                ;Заполняются параметры CreateWindowEx
	mov eax, dword ptr [ebp+08h]
	mov dword ptr [esp+28h], eax
	mov dword ptr [esp+24h], NULL
	mov dword ptr [esp+20h], NULL
	mov dword ptr [esp+1Ch], CW_USEDEFAULT
	mov dword ptr [esp+18h], CW_USEDEFAULT
	mov dword ptr [esp+14h], CW_USEDEFAULT
	mov dword ptr [esp+10h], CW_USEDEFAULT
	mov dword ptr [esp+0Ch], WS_OVERLAPPEDWINDOW
	mov [esp+08h], offset szTitle
	mov [esp+04h], offset szClassName	
	mov dword ptr [esp], NULL

	call CreateWindowEx
	sub esp, 30h
	mov dword ptr [ebp-0Ch], eax
	
	push MB_OK                                                 
	push OFFSET szMes_1
	push OFFSET szMes_1
	push NULL
	call MessageBox                                              ;до MessageBox управление не доходит

        ...
Label17:
        ret

Последний раз редактировалось IRomanKozlov; 07.02.2013 в 13:15.
IRomanKozlov вне форума Ответить с цитированием
Старый 07.02.2013, 14:21   #2
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Ещё бы коды команд числами записал для полного счастья... Не возвращаться из CreateWindow может, если виснет в WndProc при обработке WM_CREATE.
И посмотри стек под отладчиком, потому что нельзя просто взять и адресовать относительно esp без ошибок.

Последний раз редактировалось Somebody; 07.02.2013 в 14:26.
Somebody вне форума Ответить с цитированием
Старый 07.02.2013, 15:00   #3
IRomanKozlov
Пользователь
 
Регистрация: 24.07.2011
Сообщений: 11
По умолчанию

Цитата:
Сообщение от Somebody Посмотреть сообщение
Не возвращаться из CreateWindow может, если виснет в WndProc при обработке WM_CREATE.
Спасибо. Проблема была именно в этом.
Цитата:
Сообщение от Somebody Посмотреть сообщение
Ещё бы коды команд числами записал для полного счастья...
Запишу обязательно
IRomanKozlov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание окна CreateWindowEx _PROGRAMM_ Win Api 10 21.02.2012 14:16
Программа виснет на CreateWindowEx YourLastSong Win Api 8 12.01.2012 02:09
проблема с CreateWindowEx MasterSporta Win Api 3 17.03.2011 02:52
FormStyle:=none, с помощью CreateWindowEx Alex Cones Общие вопросы Delphi 5 06.11.2009 19:45
Создание окна через CreateWindowEx Nowichok Win Api 18 16.12.2006 16:37