.386 .model flat, stdcall option casemap :none include C:\MASM32\INCLUDE\windows.inc include C:\MASM32\INCLUDE\kernel32.inc include C:\MASM32\INCLUDE\shell32.inc include C:\MASM32\INCLUDE\masm32.inc includelib C:\MASM32\LIB\kernel32.lib includelib C:\MASM32\LIB\shell32.lib ; ########################################## .data h_output dd 0 str1 db "hi",0 str_len dd 0 gg dd 0 .code start: invoke GetStdHandle,STD_OUTPUT_HANDLE mov h_output, eax invoke lstrlen, offset str1 mov str_len,eax invoke WriteFile, h_output, ADDR str1, str_len, ADDR gg, NULL invoke ExitProcess,0 end start посмотрите плз, пол дня дундохался
а блин забыл вопрос написать когда делаю: invoke GetStdHandle,STD_OUTPUT_HANDLE в флаг c становится 1 а eax получает 7 что здесь не так???
Ну так MSDN почитай "If the function succeeds, the return value is a handle of the specified device. If the function fails, the return value is the INVALID_HANDLE_VALUE flag. To get extended error information, call GetLastError." Api возвращают результат в eax, проверить на ошибку можно наверное так (в этом случае может и лишнее): Код (Text): invoke GetStdHandle,STD_OUTPUT_HANDLE cmp eax,INVALID_HANDLE_VALUE jz error test eax,eax jz error Если прога скомпилена не в консоль, то ф-ция вернет 0 (GetLastError в т.ч.)
Это в бормановском хелпе чето флаг дописали ... <font color="red]If the function fails, the return value is the INVALID_HANDLE_VALUE flag</font><!--color-->
LMZ Тут вот какое дело... Дос - он, конечно, хорош, но он кончился. Теперь винда и в ней свои правила. Эти правила не имеют общего с правилами доса, так что нужно изучить их заново. В помощь тебе MSDN или Platform SDK (см. FAQ).
.data h_output dd 0 str1 db "hi",0 str_len dd 0 gg dd 0 err dd 0 .code start: invoke GetStdHandle,STD_OUTPUT_HANDLE mov h_output, eax invoke lstrlen, offset str1 mov str_len,eax invoke WriteConsole, h_output, ADDR str1, str_len, ADDR gg, NULL invoke GetLastError mov err,eax invoke ExitProcess,0 end start вот написал, ничего не пашет в err после getlasterrror попадает 6. в чём тут дело?
Перечитай внимательно первый ответ (компилить надо с ключем линкера /SUBSYSTEM:CONSOLE, в батнике поменяй)
а всё работает я поменял при компиляции C:\masm32\bin\Ml.exe /c /coff %1.asm C:\masm32\bin\Link.exe /SUBSYSTEM:CONSOLE %1.obj %1.exe pause где CONSOLE у меня было WINDOW
Error Code 6 означает Invalid Handle. Ты уверен, что у тебя прога с нужными ключами собирается (насколько я могу судить по приведенному куску кода, это масм). Тебе нужны ключи для сборки консольной проги. Если консоли нет, GetStdHandle вернет -1, а WriteConsole вернет false и GetLastError вернет 6.