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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.02.2011, 21:51   #1
Serjuk
Форумчанин
 
Регистрация: 06.08.2009
Сообщений: 136
По умолчанию Компиляция графических приложений

Здравствуйте)Ребят объясните пожалуйста как компилировать графические приложения..Прочитал Ирвина, но там как то мало и не очень понятно...Компилировал консольные приложения в MASM 6.15 путем
make32 название программы ,а как компилировать графическое приложение этим пакетом, например такую программу?

Код:
TITLE Графическое приложение для Windows

;Эта программа отображает на экране основное окно, размеры которого 
;можно изменить, и несколько окон сообщений

.386
.model flat,STDCALL
INCLUDE GraphWin.inc

;====================Данные======================

.data

AppLoadMsgTitle  BYTE  "Prilojenie zagryjeno",0
AppLoadMsgtext   BYTE  "Eto okno otobrajeno posle polycheniya"
                 BYTE  "coobweniya WM_CREATE",0

PopupTitle       BYTE  "Okno coobweniya",0
PopupText        BYTE  "Eto okno bilo aktivirovano posle "
                 BYTE  "polycheniya coobweniya WM_LBUTTONDOWN",0
GreetTitle       BYTE  "Ocnovnoe okno programmi aktivirovano ",0
GreetText        BYTE  "Eto okno otobrajeno cray posle vizova "
                 BYTE  "fynckcii CreateWindow i UpdateWindow",0
CloseMsg         BYTE  "Polycheno coobwenie WM_CLOSE",0
ErrorTitle       BYTE  "Owubka",0
WindowName       BYTE  "Grafucheckaya assemblernya programma",0
className        BYTE  "ASMWin",0

;Определим структурную переменную, описывающую класс окна

MainWin   WNDCLASS <NULL,WinProc,NULL,NULL,NULL,NULL,NULL,\
                    COLOR_WINDOW,NULL,className>

msg            MSGStruct <>
winRect        RECT      <>
hMainWnd       DWORD     ? 
hInstance      DWORD     ?


;===================КОД=========================

.code
WinMain PROC
; Определим дескриптор текущего процесса
INVOKE GetModuleHandle,NULL
mov hInstance,eax
mov MainWin.hInstance,eax

;Загрузим образы пиктограммы и курсора программы.
INVOKE LoadIcon,NULL,IDI_APPLICATION
mov MainWin.hIcon , eax

INVOKE LoadCursor , NULL,IDC_ARROW
mov MainWin.hCursor ,eax

;Зарегистрируем класс окна
INVOKE RegisterClass,ADDR MainWin
.IF eax ==0
call ErrorHandler
jmp Exit_Program
.ENDIF

;Создадим основное окно программы
INVOKE CreateWindowEx, 0,ADDR className,
       ADDR WindowName,MAIN_WINDOW_STYLE
       CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT
       CW_USEDEFAULT,NULL,NULL,hInstance,NULL

;Если функция CreateWindowEx завершилась аварийно, отобразим
; сообщение и выйдем из программы.
.IF eax ==0
call ErrorHandler
jmp Exit_Program
.ENDIF

;Запомним дескриптор окна, отобразим окно на экране и 
;обновим его содержимое 
mov hMainWnd , eax
INVOKE ShowWindow , hMainWnd , SW_SHOW
INVOKE UpdateWindow , hMainWnd

;Выведем приветственное сообщение
INVOKE MessageBox,hMainWnd,ADDR GreetText,
       ADDR GreetTitle, MB_OK

;Создадим цикл обработки сообщений
Message_Loop: 

;Получим новое сообщение из очереди
INVOKE GetMessage,ADDR msg,NULL,NULL,NULL

;Если в очереди больше нет сообщений, завершим
;работу программы
.IF eax == 0 
jmp Exit_Program
.ENDIF

;Отправим сообщение на обработку процедуре WinProc нашей программы
INVOKE DispatchMessage , ADDR msg
jmp Message_Loop

Exit_Program:
INVOKE ExitProcess,0
WinMain ENDP


;-------------------------------------------
WinProc PROC,
            hWnd:DWORD,localMsg:DWORD,wParam:DWORD,lParam:DWORD
;Эта процедура обрабатывает некоторые сообщения,посылаемые
;системой Windows нашему приложению
;Обработка остальных сообщений выполняется стандартной 
;процедурой системы Windows
;-------------------------------------------

mov eax,localMsg
.IF eax ==WM_LBUTTONDOWN ;Щелчок левой кнопкой мыши ?
INVOKE MessageBox,hWnd,ADDR PopupText,
       ADDR PoputTitle,MB_OK
jmp WinProcExit

.ELSEIF eax == WM_CREATE ;Окно создано ?
INVOKE MessageBox,hWnd,ADDR AppLoadMsgText,
       ADDR AppLoadMsgTitle, MB_OK
jmp WinProcExit

.ELSEIF eax == WM_CLOSE ; Окно закрыто?
INVOKE MessageBox,hWnd,ADDR CloseMsg,
       ADDR WindowName,MB_OK
INVOKE PostQuitMessage,0
jmp WinProcExit
.ELSE ;другие сообщения
INVOKE DefWindowProc , hWnd,localMsg,wParam,lParam
jmp WinProcExit
.ENDIF

WinProcExit:
ret
WinProc ENDP

;-------------------------------------------

ErrorHandler PROC
;Выведем системное сообщение об ошибке
;-------------------------------------------

.data 
pErrorMsg    DWORD  ?       ; Адрес сообщения об ошибке
messageID    DWORD  ?

.code
INVOKE GetLastError     ;в EAX возвращается код ошибки
mov messageID,eax   

;Определим адрес текстового сообщения об ошибке
INVOKE FormatMessage , FORMAT_MESSAGE_ALLOCATE_BUFFER + \

FORMAT_MESSAGE_FROM_SYSTEM,NULL,messageID,NULL,
                          ADDR pErrorMsg,NULL,NULL

;Отобразим сообщение об ошибке
INVOKE MessageBox,NULL,pErrorMsg,ADDR ErrorTitle,
MB_ICONERROR+MB_OK
;Освободим память, занимаемую текстовой строкой
;сообщения об ошибке
INVOKE LocalFree, pErrorMsg
ret
ErrorHandler ENDP
END WinMain
Serjuk вне форума Ответить с цитированием
Старый 05.02.2011, 14:34   #2
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

в чём собственно проблема состоит? Какие ошибки выводит при компиляции?
rpy3uH вне форума Ответить с цитированием
Старый 06.02.2011, 14:00   #3
Serjuk
Форумчанин
 
Регистрация: 06.08.2009
Сообщений: 136
По умолчанию

Вопрос в общем в том,как компилировать..Понял,что для того чтобы скомпилировать графическое приложение надо создать свой bat -ник.Попробовал собрать его - не получилось..Делал так :
Есть папка winapi в ней находиться winapi.asm и есть папка программы masm32 в ней папки examples,INCLUDE,LIB , ну и много файлов..таких как ML.exe , LINK32.exe. На всякий случай поместил winapi.asm в masm32.
Далее открываю cmd ,ввожу там:

Цитата:
C:\masm32\ML /c /coff /Cp winapi.asm
Выдает следующее:

Цитата:

C:\Users\Серега>C:\masm32\ML /c /coff /Cp winapi.asm
Microsoft (R) Macro Assembler Version 6.15.8803
Copyright (C) Microsoft Corp 1981-2000. All rights reserved.

Assembling: winapi.asm
MASM : fatal error A1000: cannot open file : winapi.asm
Выдает ошибку,что не может найти файл..Соответственно, никаких файлов не появляется..Далее набираю команду :


Цитата:
C:\masm32\LINK32 winapi.obj /subsystem:windows
и получаю :
Цитата:


C:\Users\Серега>C:\masm32\LINK32 winapi.obj /subsystem:windows
Microsoft (R) Incremental Linker Version 6.00.8447
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

LINK32 : fatal error LNK1181: cannot open input file "winapi.obj"
Что я делаю не так ?
Serjuk вне форума Ответить с цитированием
Старый 06.02.2011, 15:24   #4
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

попробуй укажи полный путь к winapi.asm
rpy3uH вне форума Ответить с цитированием
Старый 06.02.2011, 15:30   #5
yuran666666
Форумчанин
 
Аватар для yuran666666
 
Регистрация: 23.04.2009
Сообщений: 346
По умолчанию

>>Есть папка winapi в ней находиться winapi.asm
>>C:\masm32\ML /c /coff /Cp winapi.asm

ежели папка winapi не является переменной среды, то для нее нужно указывать полный путь:
C:\masm32\ML /c /coff /Cp %path%/winapi/winapi.asm

или же создайте бат файл с содержимым:
C:\masm32\ML /c /coff /Cp *.asm
C:\masm32\LINK32 /subsystem:windows *.obj
и запускайте данный батник из папки в которой находится асм-файл собираемой программы
Нет, ну правда..
yuran666666 вне форума Ответить с цитированием
Старый 06.02.2011, 16:01   #6
Serjuk
Форумчанин
 
Регистрация: 06.08.2009
Сообщений: 136
По умолчанию

Цитата:
или же создайте бат файл с содержимым:
C:\masm32\ML /c /coff /Cp *.asm
C:\masm32\LINK32 /subsystem:windows *.obj
и запускайте данный батник из папки в которой находится асм-файл собираемой программы
Попробовал, получается :
Цитата:
Microsoft Windows [Version 6.1.7600]
(c) Корпорация Майкрософт (Microsoft Corp.), 2009. Все права защищены.

C:\Users\Серега>C:\masm32\ML /c /coff /Cp *.asm
Microsoft (R) Macro Assembler Version 6.15.8803
Copyright (C) Microsoft Corp 1981-2000. All rights reserved.

Assembling: *.asm
MASM : fatal error A1000: cannot open file : *.asm

C:\Users\Серега>C:\masm32\LINK32 /subsystem:windows *.obj
Microsoft (R) Incremental Linker Version 6.00.8447
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

LINK32 : warning LNK4001: no object files specified; libraries used
LINK32 : warning LNK4068: /MACHINE not specified; defaulting to IX86
LINK32 : fatal error LNK1159: no output file specified

C:\Users\Серега>
При варианте :
Цитата:
ежели папка winapi не является переменной среды, то для нее нужно указывать полный путь:
C:\masm32\ML /c /coff /Cp C:/winapi/winapi.asm
Получается :
Цитата:
Microsoft Windows [Version 6.1.7600]
(c) Корпорация Майкрософт (Microsoft Corp.), 2009. Все права защищены.

C:\Users\Серега>C:\masm32\ML /c /coff /Cp C:/winapi/winapi.asm
Microsoft (R) Macro Assembler Version 6.15.8803
Copyright (C) Microsoft Corp 1981-2000. All rights reserved.

Assembling: C:/winapi/winapi.asm
C:/winapi/winapi.asm(64) : error A2137: too few arguments to INVOKE
C:/winapi/winapi.asm(66) : error A2008: syntax error : CW_USEDEFAULT
C:/winapi/winapi.asm(67) : error A2008: syntax error : CW_USEDEFAULT
C:/winapi/winapi.asm(118) : error A2006: undefined symbol : PoputTitle
C:/winapi/winapi.asm(118) : error A2114: INVOKE argument type mismatch : argumen
t : 3
C:/winapi/winapi.asm(123) : error A2006: undefined symbol : AppLoadMsgText
C:/winapi/winapi.asm(123) : error A2114: INVOKE argument type mismatch : argumen
t : 2
C:/winapi/winapi.asm(156) : error A2137: too few arguments to INVOKE
C:/winapi/winapi.asm(156) : error A2016: expression expected
C:/winapi/winapi.asm(156) : error A2114: INVOKE argument type mismatch : argumen
t : 1
C:/winapi/winapi.asm(158) : error A2008: syntax error : FORMAT_MESSAGE_FROM_SYST
EM

C:\Users\Серега>
Выдает ошибки - вроде проверил, написано все нормально или это из-за того, что надо еще какую то библиотеку приписать ?
И еще вопрос - какое название будет у батника , когда он появится?
Serjuk вне форума Ответить с цитированием
Старый 06.02.2011, 16:13   #7
yuran666666
Форумчанин
 
Аватар для yuran666666
 
Регистрация: 23.04.2009
Сообщений: 346
По умолчанию

ошибки в исходном тексте - писать нужно начинать от простого к сложному, а не наоборот
Нет, ну правда..
yuran666666 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
движение графических объектов elka Общие вопросы C/C++ 9 25.04.2012 17:24
Вывод графических объектов rocky7 Общие вопросы C/C++ 2 20.08.2009 12:27
Лента графических файлов бел Помощь студентам 1 13.04.2009 10:15
Построение графических моделей. satanatas Помощь студентам 3 13.01.2008 07:52
Открытия графических файлов Kocapb Общие вопросы C/C++ 3 01.12.2007 19:11