· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.WIN32 —› Ошибка при создании окна!!

Посл.отвђт Сообщенiе


Дата: Июл 10, 2003 17:15:58

Доброго Всем утра, дня и вечера!!
У меня собственно вот какая проблема! Переписываю пример программы из книги и начинаю компилить, вроде при компиляции все нормально идет, но когда я запускаю экзешник - выдается сообщение об ошибке и все!(окно даже не появл..) Я прогнал этот экзешник под дебагером и увидел, что при вызове функции CreateWindowExA происходит ошибка!!
Мои предположения остановились на том что неправильно(автор опечатолся) написан параметр dwStyle
В предыдущих примерах это параметр равнялся :
WS_OVERLAPPEDWINDOW EQU 000CF0000H
и все работало!!!!!!!
а в этом(примере):
WS_TABSTOP EQU 10000H
WS_SYSMENU EQU 80000H
WS_OVERLAPPEDWINDOW EQU WS_TABSTOP+WS_SYSMENU
может ли это быть из-за этого???
Программа должна выводить окно с кнопкой выхода и списком!!
И вот как раз еще один вопрос возник! как определяются эти значения для WS_TABSTOP, WS_SYSMENU?? или это постоянный??? так почему они не где не написаны(я про хелп)?? или я плохо смотрел(у меня хелп от си)?? Подскажите где мне искать эти константы?
Пожалуйста напишите ответ, как можно полнее!!(я все таки еще учусь) или укажите где посмотреть??
Заранее благодарен!!!!! :)


Дата: Июл 10, 2003 18:18:24

Константы типа WS_xxx - это принадлежность системы - меняться оне не могут. Конечно же, WS_OVERLAPPEDWINDOW не есть WS_TABSTOP+WS_SYSMENU. Просто автору надо было передать эти параметры, вот он и заменил WS_OVERLAPPEDWINDOW.

Все константы для WINDOWS должны находится в одном из файлов, который должен быть в пакете АSSEMLER-a, который Вы используете.

Далее, WS_TABSTOP обычно используется для элементов диалогового окна. Попробуйте заменить на WS_POPUP+WS_SYSMENU. Неплохо было бы посмотреть на Ваш код полностью.

Здесь есть неплохие примеры кода:
http://spiff.tripnet.se/~iczelion/tutorials.html


Дата: Июл 10, 2003 18:30:06 · Поправил: Безпощадный даос

Код нужен!? да пожалуста!!
list.inc
WM_SETFOCUS		EQU	7H
WM_DESTROY		EQU	2
WM_CREATE		EQU	1
WM_COMMAND		EQU	111H
WM_SETTEXT		EQU	0CH
WM_GETTEXT		EQU	0DH
LB_ADDSTRING		EQU	180H
LB_GETTEXT		EQU	189H
LB_GETCURSEL		EQU	188H
LBN_DBLCLK		EQU	2
CS_VREDRAW		EQU	1H
CS_HREDRAW		EQU	2H
CS_GLOBALCLASS		EQU	4000H
WS_TABSTOP		EQU	10000H
WS_SYSMENU		EQU	80000H
WS_THICKFRAME		EQU	40000H
WS_OVERLAPPEDWINDOW	EQU	WS_TABSTOP+WS_SYSMENU
STYLE			EQU	CS_HREDRAW+CS_VREDRAW+CS_GLOBALCLASS
BS_DEFPUSHBUTTON	EQU	1H
WS_VISIBLE		EQU	10000000H
WS_CHILD		EQU	40000000H
WS_BORDER		EQU	800000H
WS_VSCROLL		EQU	200000H
LBS_NOTIFY		EQU	1H
STYLBTN			EQU	WS_CHILD+BS_DEFPUSHBUTTON+WS_VISIBLE+WS_TABSTOP
STYLLST			EQU	WS_THICKFRAME+WS_CHILD+WS_VISIBLE+WS_BORDER+WS_TABSTOP+W  S_VSCROLL+LBS_NOTIFY
IDI_APPLICATION		EQU	32512
IDC_ARROW		EQU	32512
SW_SHOWNORMAL		EQU	1
EXTERN			SetFocus:NEAR
EXTERN			SendMessageA:NEAR
EXTERN			MessageBoxA:NEAR
EXTERN			CreateWindowExA:NEAR
EXTERN			DefWindowProcA:NEAR
EXTERN			DispatchMessageA:NEAR
EXTERN			ExitProcess:NEAR
EXTERN			GetMessageA:NEAR
EXTERN			GetModuleHandleA:NEAR
EXTERN			LoadCursorA:NEAR
EXTERN			LoadIconA:NEAR
EXTERN			PostQuitMessage:NEAR
EXTERN			RegisterClassA:NEAR
EXTERN			ShowWindow:NEAR
EXTERN			TranslateMessage:NEAR
EXTERN			UpdateWindow:NEAR
MSGSTRUCT		STRUC
			MSHWND		DD	?
			MSMESSAGE	DD	?
			MSWPARAM	DD	?
			MSLPARAM	DD	?
			MSTIME		DD	?
			MSPT		DD	?
MSGSTRUCT		ENDS
WNDCLASS		STRUC
			CLSSTYLE	DD	?
			CLWNDPROC	DD	?
			CLSCBCLSEX	DD	?
			CLSCBWNDEX	DD	?
			CLSHINST	DD	?
			CLSHICON	DD	?
			CLSHCURSOR	DD	?
			CLBKGROUND	DD	?
			CLMENNAME	DD	?
			CLNAME		DD	?
WNDCLASS		ENDS

list.asm
		.386P
		.MODEL		FLAT, STDCALL
INCLUDE		list.inc
INCLUDELIB	C:\Temp\Tasm\Lib\Import32.lib
_DATA		SEGMENT DWORD PUBLIC USE32 'DATA'
		NEWHWND		DD	0
		MSG		MSGSTRUCT <?>
		WC		WNDCLASS <?>
		HINST		DD	0
		TITLENAME	DB	'Пример - окно LISTBOX',0
		CLASSNAME	DB	'CLASS32',0
		CPBUT		DB	'Выход',0
		CPLST		DB	'',0
		CLSBUTN		DB	'BUTTON',0
		CLSLIST		DB	'LISTBOX',0
		HWNDBTN		DD	0
		HWNDLST		DD	0
		CAP		DB	'Сообщение',0
		CAP1		DB	'Выбран',0
		MES		DB	'Конец работы программы',0
		STR1		DB	'Красный',0
		STR2		DB	'Зеленый',0
		STR3		DB	'Синий',0
		STR4		DB	'Желтый',0
		STR5		DB	'Черный',0
		STR6		DB	'Белый',0
		PS		DWORD	OFFSET	STR1
				DWORD	OFFSET	STR2
				DWORD	OFFSET	STR3
				DWORD	OFFSET	STR4
				DWORD	OFFSET	STR5
				DWORD	OFFSET	STR6
		BUF		DB	30 DUP(0)
_DATA		ENDS
_TEXT		SEGMENT DWORD PUBLIC USE32 'CODE'
START:		PUSH		0
		CALL		GetModuleHandleA
		MOV		[HINST],EAX
REG_CLASS:	MOV		[WC.CLSSTYLE],STYLE
		MOV		[WC.CLWNDPROC],OFFSET WNDPROC
		MOV		[WC.CLSCBCLSEX],0
		MOV		[WC.CLSCBWNDEX],0
		MOV		EAX,[HINST]
		MOV		[WC.CLSHINST],EAX
		PUSH		IDI_APPLICATION
		PUSH		0
		CALL		LoadIconA
		MOV		[WC.CLSHICON],EAX
		PUSH		IDC_ARROW
		PUSH		0
		CALL		LoadCursorA
		MOV		[WC.CLSHCURSOR],EAX
		MOV		[WC.CLBKGROUND],17
		MOV		DWORD PTR [WC.CLMENNAME],0
		MOV		DWORD PTR [WC.CLNAME],OFFSET CLASSNAME
		PUSH		OFFSET WC
		CALL		RegisterClassA
		PUSH		0
		PUSH		[HINST]
		PUSH		0
		PUSH		0
		PUSH		150
		PUSH		400
		PUSH		100
		PUSH		100
		PUSH		WS_OVERLAPPEDWINDOW
		PUSH		OFFSET TITLENAME
		PUSH		OFFSET CLASSNAME
		PUSH		0
		CALL		CreateWindowExA
		CMP		EAX,0
		JZ		_ERR
		MOV		[NEWHWND],EAX
		PUSH		SW_SHOWNORMAL
		PUSH		[NEWHWND]
		CALL		ShowWindow
		PUSH		[NEWHWND]
		CALL		UpdateWindow
MSG_LOOP:	PUSH		0
		PUSH		0
		PUSH		0
		PUSH		OFFSET MSG
		CALL		GetMessageA
		CMP		EAX,0
		JE		END_LOOP
		PUSH		OFFSET MSG
		CALL		TranslateMessage
		PUSH		OFFSET MSG
		CALL		DispatchMessageA
		JMP		MSG_LOOP
END_LOOP:	PUSH		[MSG.MSWPARAM]
		CALL		ExitProcess
_ERR:		JMP		END_LOOP
WNDPROC		PROC
		PUSH		EBP
		MOV		EBP,ESP
		PUSH		EBX
		PUSH		EDI
		PUSH		ESI
		CMP		DWORD PTR [EBP+0CH],WM_DESTROY
		JE		WMDESTROY
		CMP		DWORD PTR [EBP+0CH],WM_CREATE
		JE		WMCREATE
		CMP		DWORD PTR [EBP+0CH],WM_COMMAND
		JE		WMCOMMAND
		JMP		DEFWNDPROC
WMCOMMAND:	MOV		EAX,HWNDBTN
		CMP		DWORD PTR [EBP+14H],EAX
		JE		WMDESTROY
		MOV		EAX,HWNDLST
		CMP		DWORD PTR [EBP+14H],EAX
		JNE		NOLIST
		CMP		WORD PTR [EBP+12H],LBN_DBLCLK
		JNE		NOLIST
		PUSH		0
		PUSH		0
		PUSH		LB_GETCURSEL
		PUSH		HWNDLST
		CALL		SendMessageA
		PUSH		0
		PUSH		OFFSET CAP1
		PUSH		OFFSET BUF
		PUSH		DWORD PTR [EBP+08H]
		CALL		MessageBoxA
NOLIST:		MOV		EAX,0
		JMP		FINISH
WMCREATE:	PUSH		0
		PUSH		[HINST]
		PUSH		0
		PUSH		DWORD PTR [EBP+08H]
		PUSH		20
		PUSH		60
		PUSH		10
		PUSH		10
		PUSH		STYLBTN
		PUSH		OFFSET CPBUT
		PUSH		OFFSET CLSBUTN
		PUSH		0
		CALL		CreateWindowExA
		MOV		HWNDBTN,EAX
		PUSH		0
		PUSH		[HINST]
		PUSH		0
		PUSH		DWORD PTR [EBP+08H]
		PUSH		90
		PUSH		150
		PUSH		50
		PUSH		10
		PUSH		STYLLST
		PUSH		OFFSET CPLST
		PUSH		OFFSET CLSLIST
		PUSH		0
		CALL		CreateWindowExA
		MOV		HWNDLST,EAX
		PUSH		PS
		PUSH		0
		PUSH		LB_ADDSTRING
		PUSH		HWNDLST
		CALL		SendMessageA
		PUSH		PS+4
		PUSH		0
		PUSH		LB_ADDSTRING
		PUSH		HWNDLST
		CALL		SendMessageA
		PUSH		PS+8
		PUSH		0
		PUSH		LB_ADDSTRING
		PUSH		HWNDLST
		CALL		SendMessageA
		PUSH		PS+12
		PUSH		0
		PUSH		LB_ADDSTRING
		PUSH		HWNDLST
		CALL		SendMessageA
		PUSH		PS+16
		PUSH		0
		PUSH		LB_ADDSTRING
		PUSH		HWNDLST
		CALL		SendMessageA
		PUSH		PS+20
		PUSH		0
		PUSH		LB_ADDSTRING
		PUSH		HWNDLST
		CALL		SendMessageA
		MOV		EAX,0
		JMP		FINISH
DEFWNDPROC:	PUSH		DWORD PTR [EBP+14H]
		PUSH		DWORD PTR [EBP+10H]
		PUSH		DWORD PTR [EBP+0CH]
		PUSH		DWORD PTR [EBP+08H]
		CALL		DefWindowProcA
WMDESTROY:	PUSH		0
		PUSH		OFFSET CAP
		PUSH		OFFSET MES
		PUSH		DWORD PTR [EBP+08H]
		CALL		MessageBoxA
		PUSH		0
		CALL		PostQuitMessage
		MOV		EAX,0
FINISH:		POP		ESI
		POP		EDI
		POP		EBX
		RET		16
WNDPROC		ENDP
_TEXT		ENDS
		END		START


Дата: Июл 10, 2003 18:34:14

я тасмом компилю - где там эти константы??


Дата: Июл 10, 2003 19:20:40

У мнея еще один вопрос!! может и туповат он, но все же! Как в масме создавать файл листинга!?? я уже перепробовал все команды, но уверен все не правильно
я делал так "ml /c /coff /Fl name.asm" и т.д. ??


Дата: Июл 10, 2003 21:29:43

В ТASM5 есть несколько директорий - ищите файлы с расширением INC. Есть файл WINDOWS.INC (16-бит) и W32.INC (32-бит) - вот этот второй и надо использовать. Кроме того:
		CALL		DefWindowProcA
WMDESTROY:	PUSH		0

Любое необработанное сообщение провалится в вызов PostQuitMessage(). Наверное, здесь не хватает "JMP FINISH":
		CALL		DefWindowProcA
		JMP		FINISH
WMDESTROY:	PUSH		0


Дата: Июл 11, 2003 02:41:38

[ Sergey: Как в масме создавать файл листинга!?? ]

\masm32\bin\ml /c /coff /Fl /Sn /Sc name.asm


Дата: Июл 11, 2003 18:03:21

Four-F спасибо!!

AsmGuru62 Вам тоже спасибо!! насчет джампа я конечно же промухал!:) Но поставив его, прога все равно не хочет работать!!! Я посмотрел Инковские файлв и нашел в них строки WS_SYSMENU и WS_TABSTOP , так что интересно, в масме они равны 80000H и 100000H соответственно, а в тасме наоборот(правда в тасме они пределены директивой "=", а в масме "equ" - может из-за этого) 00008H и 00001H!!!Почему?? Я пробовал и те и те варианты ВСЕ равно ничего не пашет! пробовал, также компилить и под тасм, и под масм!! Не пашет хоть ты тресни!!! Выдает сообщение что приложение вызвало ошибку и будет закрыто!!! ????

!!!Помогите пожалуста!!! Мне эта программа спать спокойно не дает!! Заранее благодарен!!


Дата: Июл 11, 2003 20:00:57

'equ' работает также как и '=' - там отличие в другом.
Странно, что значения разные для разных пакетов!!..
Из 'Visual C++' видно, что:
#define WS_SYSMENU          0x00080000L
#define WS_TABSTOP          0x00010000L

Так что MASM верен в этом случае.
Я попробую прогнать этот код.


Дата: Июл 11, 2003 22:47:40

Сравни вот это на входе WNDPROC:
WNDPROC		PROC
		PUSH		EBP
		MOV		EBP,ESP
		PUSH		EBX
		PUSH		EDI
		PUSH		ESI

С вот этим на выходе:
FINISH:		POP		ESI
		POP		EDI
		POP		EBX
		RET		16

Как видно нет соответствующего кода восстановления стека.
FINISH:		POP		ESI
		POP		EDI
		POP		EBX
		MOV		ESP, EBP
		POP		EBP
		RET		16

И еще совет: найди лучшие исходники для учебы.
В этом уж слишком много клизм...


Дата: Июл 12, 2003 02:12:02

Не работает потому, что определено WS_SYSMENU без WS_CAPTION, где sysmenu то будет если заголовка окна нет?
Сделай
WS_OVERLAPPEDWINDOW EQU WS_TABSTOP or WS_SYSMENU or
WS_CAPTION
Или SYSMENU убери, тогда без заголовка будет


Дата: Июл 12, 2003 14:33:00

Спасибо Всем огромное, ДРУЗЬЯ!!! век не забуду!
Благодара Вашим советам все заработало!! УРРААА!! :)


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.036