Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для Windows/Dos > Ошибка в подключаемом файле


Автор: NFL 14.1.2010, 15:35
Есть следующий текст программы (что то вроде лаюораторной работы) :

Код

.686
.model flat, stdcall
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\gdi32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\gdi32.lib
includelib \masm32\lib\kernel32.lib
WinMain proto :DWORD, :DWORD
.data
ClassName db "SimpleWin", 0
AppName db "Обробка повідомлень клавіатури", 0
char WPARAM 20h
.data?
hInstance HINSTANCE ?
.code
_st:
invoke GetModuleHandle, NULL
mov hInstance, eax
invoke WinMain, hInstance, SW_SHOWDEFAULT
invoke ExitProcess, eax
WinMain proc hInst:HINSTANCE, CmdShow:DWORD
LOCAL wc:WNDCLASSEX
LOCAL msg:MSG
LOCAL hwnd:HWND
push hInst
pop wc.hInstance
mov wc.cbSize, SIZEOF WNDCLASSEX
mov wc.style, CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc, OFFSET WndProc
mov wc.hbrBackground, COLOR_WINDOW+1
mov wc.lpszMenuName, NULL
mov wc.lpszClassNane, OFFSET ClassName
invoke LoadIcon, NULL, IDI_APPLICATION
mov wc.hIcon, eax
mov wc.hIconSm, eax
invoke LoadCursor, NULL, IDC_ARROW
mov wc.hCursor, eax
mov wc.cbClsExtra, NULL
mov wc.cbWndExtra, NULL
invoke RegisterClassEx, ADDR wc
invoke CreateWindowEx, 0, ADDR ClassName, ADDR AppName, WS_OVERLAPPEDWINDOW,\
CW_USERDEFAULT, CW_USERDEFAULT, CW_USERDEFAULT, CW_USERDEFAULT,\
NULL, NULL, hInst, NULL
mov hwnd, eax
invoke ShowWindow, hwnd, SW_SHOWNORMAL
invoke UpdateWindow, hwnd
.WHILE TRUE
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
.ENDW
mov eax, msg.wParam
ret
WinMain endp
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam: LPARAM
LOCAL hdc:HDC
LOCAL ps: PAINTSTRUCT
.IF uMsg==WM_DESTROY
invoke PostQuitMessage, 0
.ELSEIF uMsg==WM_CHAR
pushwParam
pop char
invoke InvalidateRect, hWnd, NULL, TRUE
.ELSEIF uMsg==WM_PAINT
invoke BeginPaint, hWnd, ADDR ps
mov hdc, eax
invoke TextOut, hdc, 20, 20, ADDR char, 1
invoke End Paint, hWnd, ADDR ps
.ELSE
invoke DefWindowProc, hWnd, uMsg, wParam, lParam
ret
.ENDIF
xor eax, eax
ret
WndProc endp
end _st


На компьютере установлен MASM32 Editor v10.
При попытке ассемблирования получаю кучу сообщений такого вида:


Assembling: C:\masm32\bin\windowproc.asm
\masm32\include\windows.inc(129) : error A2004: symbol type conflict : bool
\masm32\include\windows.inc(7804) : error A2179: structure improperly initialized
\masm32\include\windows.inc(7804) : error A2008: syntax error : in structure
\masm32\include\windows.inc(8711) : error A2179: structure improperly initialized
\masm32\include\windows.inc(8711) : error A2008: syntax error : in structure
\masm32\include\windows.inc(8724) : error A2179: structure improperly initialized
\masm32\include\windows.inc(8724) : error A2008: syntax error : in structure
\masm32\include\windows.inc(8736) : error A2179: structure improperly initialized
\masm32\include\windows.inc(8736) : error A2008: syntax error : in structure


С чем это связано? Ошибка в тексте программы или в самом inc-файле? Как боротьс?... smile  smile 

Автор: Mikl_ 15.1.2010, 04:01
NFL, 
Ошибка в каком-то из подключаемых INC-файлов которые объявляют константу или структуру совпадающую по названию с объявленным в windows.inc Выявить можешь просто. Закоментариваешь по одному INC-файлы и смотришь когда исчезнет например ошибка "\masm32\include\windows.inc(7804) : error A2179: structure improperly initialized" после выявления файла начинаешь медитировать smile 

Автор: NFL 15.1.2010, 16:28
Mikl_, неее, просто забыл option casemap:none smile 
теперь другая проблема... не видит константу CW_USERDEFAULT, ну да лан, это исправимо цифрами... Но почему то окно не работает как хотелось бы...

Код

.686
.model flat, stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\gdi32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\gdi32.lib
includelib \masm32\lib\kernel32.lib

WinMain proto :DWORD, :DWORD
.data
ClassName db "SimpleWin", 0
AppName db "Обробка повідомлень клавіатури", 0
fMenu db "Файл", 0
char WPARAM 20h
.data?
hInstance HINSTANCE ?
.code
_st:
invoke GetModuleHandle, NULL
mov hInstance, eax
invoke WinMain, hInstance, SW_SHOWDEFAULT
invoke ExitProcess, eax
WinMain proc hInst:HINSTANCE, CmdShow:DWORD
LOCAL wc:WNDCLASSEX
LOCAL msg:MSG
LOCAL hwnd:HWND
push hInst
pop wc.hInstance
mov wc.cbSize, SIZEOF WNDCLASSEX
mov wc.style, CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc, OFFSET WndProc
mov wc.hbrBackground, COLOR_WINDOW+1
mov wc.lpszMenuName, ADDR fMenu
mov wc.lpszClassName, OFFSET ClassName
invoke LoadIcon, NULL, IDI_APPLICATION
mov wc.hIcon, eax
mov wc.hIconSm, eax
invoke LoadCursor, NULL, IDC_ARROW
mov wc.hCursor, eax
mov wc.cbClsExtra, NULL
mov wc.cbWndExtra, NULL
invoke RegisterClassEx, ADDR wc
invoke CreateWindowEx, 0, ADDR ClassName, ADDR AppName, WS_OVERLAPPEDWINDOW, 100, 100, 100, 100, NULL, NULL, hInst, NULL
mov hwnd, eax
invoke ShowWindow, hwnd, SW_SHOWNORMAL
invoke UpdateWindow, hwnd
.WHILE TRUE
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
.ENDW
mov eax, msg.wParam
ret
WinMain endp
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam: LPARAM
LOCAL hdc:HDC
LOCAL ps: PAINTSTRUCT
.IF uMsg==WM_DESTROY
invoke PostQuitMessage, 0
.ELSEIF uMsg==WM_CHAR
push wParam
pop char
invoke InvalidateRect, hWnd, NULL, TRUE
.ELSEIF uMsg==WM_PAINT
invoke BeginPaint, hWnd, ADDR ps
mov hdc, eax
invoke TextOut, hdc, 20, 20, ADDR char, 1
invoke EndPaint, hWnd, ADDR ps
.ELSE
invoke DefWindowProc, hWnd, uMsg, wParam, lParam
ret
.ENDIF
xor eax, eax
ret
WndProc endp
end _st

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)