StdOut проблема

Тема в разделе "WASM.BEGINNERS", создана пользователем LMZ, 5 авг 2005.

  1. LMZ

    LMZ New Member

    Публикаций:
    0
    Регистрация:
    31 июл 2005
    Сообщения:
    15
    Адрес:
    Молдова
    .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





    посмотрите плз,

    пол дня дундохался
     
  2. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    посмотрели



    <font color="white]link.exe /SUBSYSTEM:CONSOLE если не видно</font><!--color-->
     
  3. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    bogrus



    5 баллов
     
  4. LMZ

    LMZ New Member

    Публикаций:
    0
    Регистрация:
    31 июл 2005
    Сообщения:
    15
    Адрес:
    Молдова
    а блин забыл вопрос написать :dntknw:

    когда делаю:

    invoke GetStdHandle,STD_OUTPUT_HANDLE

    в флаг c становится 1 а eax получает 7

    что здесь не так???
     
  5. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Все правильно, 7 это STD_OUTPUT_HANDLE, а CF после api не определен, зачем тебе CF!?
     
  6. LMZ

    LMZ New Member

    Публикаций:
    0
    Регистрация:
    31 июл 2005
    Сообщения:
    15
    Адрес:
    Молдова
  7. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Нет конечно, в этом коде нет ...
     
  8. LMZ

    LMZ New Member

    Публикаций:
    0
    Регистрация:
    31 июл 2005
    Сообщения:
    15
    Адрес:
    Молдова
    окей понятно,

    а что указывает на ошибку (ну там какой нибудь регистр или флаг???)
     
  9. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Ну так 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):
    1.            invoke  GetStdHandle,STD_OUTPUT_HANDLE
    2.            cmp     eax,INVALID_HANDLE_VALUE
    3.            jz      error
    4.            test    eax,eax
    5.            jz      error
    Если прога скомпилена не в консоль, то ф-ция вернет 0 (GetLastError в т.ч.)
     
  10. LMZ

    LMZ New Member

    Публикаций:
    0
    Регистрация:
    31 июл 2005
    Сообщения:
    15
    Адрес:
    Молдова
    пасиб,

    буду разбираться
     
  11. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Это в бормановском хелпе чето флаг дописали ...



    <font color="red]If the function fails, the return value is the INVALID_HANDLE_VALUE flag</font><!--color-->
     
  12. n0p

    n0p 10010000b

    Публикаций:
    0
    Регистрация:
    7 май 2003
    Сообщения:
    256
    Адрес:
    Новосиbeerск
    LMZ

    Тут вот какое дело... Дос - он, конечно, хорош, но он кончился. Теперь винда и в ней свои правила. Эти правила не имеют общего с правилами доса, так что нужно изучить их заново. В помощь тебе MSDN или Platform SDK (см. FAQ).
     
  13. LMZ

    LMZ New Member

    Публикаций:
    0
    Регистрация:
    31 июл 2005
    Сообщения:
    15
    Адрес:
    Молдова
    .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.

    в чём тут дело?
     
  14. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Перечитай внимательно первый ответ (компилить надо с ключем линкера /SUBSYSTEM:CONSOLE, в батнике поменяй)
     
  15. LMZ

    LMZ New Member

    Публикаций:
    0
    Регистрация:
    31 июл 2005
    Сообщения:
    15
    Адрес:
    Молдова
    а всё работает я поменял при компиляции



    C:\masm32\bin\Ml.exe /c /coff %1.asm

    C:\masm32\bin\Link.exe /SUBSYSTEM:CONSOLE %1.obj

    %1.exe

    pause



    где CONSOLE у меня было WINDOW
     
  16. n0p

    n0p 10010000b

    Публикаций:
    0
    Регистрация:
    7 май 2003
    Сообщения:
    256
    Адрес:
    Новосиbeerск
    Error Code 6 означает Invalid Handle. Ты уверен, что у тебя прога с нужными ключами собирается (насколько я могу судить по приведенному куску кода, это масм). Тебе нужны ключи для сборки консольной проги. Если консоли нет, GetStdHandle вернет -1, а WriteConsole вернет false и GetLastError вернет 6.
     
  17. LMZ

    LMZ New Member

    Публикаций:
    0
    Регистрация:
    31 июл 2005
    Сообщения:
    15
    Адрес:
    Молдова
    уже всё пашет.

    т.к. я изменил WINDOW на CONSOLE

    выше уже писал.