Давно не трогал масм,все на С и Перле кодил,но сейчас возникла необходимость использовать масм,но возникла проблема... сам код компилится,но экзе не запускается,я думал где в коде косяки... а потом взял забил простеший вариант для проверки: Код (Text): ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= ; ПРОЦ, МОДЕЛЬ, ОПЦИИ, ИНКЛУДЫ, БИБЛИОТЕКИ ИМПОРТА ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= .386 .model flat,stdcall option casemap:none includelib kernel32.lib SetConsoleTitleA PROTO :DWORD GetStdHandle PROTO :DWORD WriteConsoleA PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD ExitProcess PROTO :DWORD Sleep PROTO :DWORD ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= ; СЕКЦИЯ КОНСТАНТ ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= .const sConsoleTitle db 'My First Console Application',0 sWriteText db 'hEILo, Wo(R)LD!!' ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= ; СЕКЦИЯ КОДА ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= .code ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= ; Самая Главная Процедура ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= Main PROC LOCAL hStdout :DWORD ;(1) ;титл консоли push offset sConsoleTitle ;(2) call SetConsoleTitleA ;получаем хэндл вывода ;(3) push -11 call GetStdHandle mov hStdout,EAX ;выводим HELLO, WORLD! ;(4) push 0 push 0 push 16d push offset sWriteText push hStdout call WriteConsoleA ;задержка, чтобы полюбоваться ;(5) push 2000d call Sleep ;выход ;(6) push 0 call ExitProcess Main ENDP ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= end Main Знакомый код ) не правда ли Но суть в том что все делается,компилится,без проблем,ошибок нет,да вот не запускается Пробовал поставить длинный Sleep в итоге окна консоли так и не вижу,хотя в процессах прога висит.
Естественно ничего не заработает как надо - ты же консоль не создаешь. То есть будет выглядеть так: Код (Text): ... Main PROC LOCAL hStdout :DWORD ;(1) call FreeConsole call AllocConsole ... Ну и не забудь добавить прототипы этих функций (они из kernel32.dll): Код (Text): FreeConsole PROTO AllocConsole PROTO
mix_mix,если вставить те функции которые ты указал,то все работает без проблем,да вот меня интересует почему у меня все тестовые примеры в RadAsm-е компилятся без ошибок,но окно приложения при запуске не появляется... А исходник я взял на вскидку, для проверки, из статьи: Win32ASM: "Hello, World" и три халявы MASM32 [Serrgio / HI-TECH] А теперь еще один вариант: Код (Text): .386 .model flat,stdcall option casemap:none includelib kernel32.lib include windows.inc include kernel32.inc .const sConsoleTitle db 'My First Console Application',0 sWriteText db 'hEILo, Wo(R)LD!!' .code Main PROC LOCAL hStdout :DWORD invoke SetConsoleTitle, offset sConsoleTitle invoke GetStdHandle, STD_OUTPUT_HANDLE mov hStdout,EAX invoke WriteConsole, hStdout, offset sWriteText, 16d, NULL, NULL invoke Sleep, 2000d invoke ExitProcess, NULL Main ENDP end Main Ключи для компиляции: c:\masm32\bin\ml /c /coff c:\masm32\test1.asm c:\masm32\bin\link /SUBSYSTEM:CONSOLE /LIBPATH:c:\masm32\lib c:\masm32\test1.obj А результат все тот же, подвисание курсора на 2 секунды без появления консоли... вот такие пироги,или я гдето сглупил или все же есть в чем-то не моя вина...
Для подобных случаев (чтобы постоянно не писать в форум) существует следущий код: Код (Text): include \masm32\include\masm32.inc includelib \masm32\lib\masm32.lib buf db 8 dup(0) ... invoke WriteConsole ... ; <- функция, которая неправильно работает ... invoke GetLastError invoke dw2a,eax,offset buf invoke MessageBox,0,offset buf,0,0 ... Далее из MSDN в system error codes находишь что за ошибку подразумевает код.
Скажем так,дебаг показал что в результате вызова: invoke GetStdHandle, STD_OUTPUT_HANDLE Появляется ошибка: ERROR_INVALID_HANDLE (00000006) Насколько я помню,понять от чего возникает эта ошибка,оч. частно тяжело,я уже умаялся... MSDN,ответа толкового не дал,увы. П.С.: на форуме это все постится лишь с одной целью,разобраться, и при этом подрозумевается что более опытный человек тебе может помочь,по крайне мере я всегда исходил из этого...
Psixo Всё указывает на то, что приложение не запускается как консольное, хотя я вижу, что флаг "/SUBSYSTEM:CONSOLE" указан. Посмотрите в PE Tools -> PE Editor или в любом другом вьювере/редакторе экзешников установлен ли флаг консоли в заголовке PE или нет.
Поставил последнию версию masm32v9, раньше стояла 6-ая версия,теперь оконные приложения работают корректно,а консольные вроде,этого без вызова: FreeConsole и AllocConsole не работают,но мне сейчас уже это как-то безразлично,главаное заработало(хоть как-то!). Всем откликнувшимся спасибо.