Вывод текста в консоль

Тема в разделе "WASM.WIN32", создана пользователем EvilsInterrupt, 23 мар 2005.

  1. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Здравствуйте.



    Я пишу код обрабатывающий параметры переданные юзером через

    командную строку. В случает неправильной передачи, я хочу

    вывести небольшую инструкцию на экран, как сделано в upx.



    Мои действия:

    GetCommandLine,AllocConsole,GetStdHandle,WriteConsole,

    FreeConsole



    Под Олли дебугом работает показывается все, что я запланиро-

    вал. Но как только запускаешь cmd и в ней пишешь свое прило-

    жение с неправильными параметреми(специально для проверки ко-

    да), то как будто бы оно быстро отрабатывает работу, но после

    себя никакого текста не оставляет!



    Если я в cmd напишу upx то выведется текст использования, как

    и мне в cmd вывести?
     
  2. _Juicy

    _Juicy Active Member

    Публикаций:
    0
    Регистрация:
    12 авг 2003
    Сообщения:
    1.159
    Адрес:
    SPb
    А почему у меня такое ощущение, что кое-кто win32 приложение закатал? :)

    Если так, Interrupt, аппликуха у тебя просто создает новую консоль и быренько завершается, а ты консольку не заметил :)



    Так что или линкуй консольное (/subsystem:console) либо находи хендл родительского приложения и пытайся аттачиться к его консоли :)
     
  3. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    именно так!



    Если юзер запустил прогу с параметрами в командной, то запускается консольная часть, иначе гуи, которая начинается с создания диалгогового окна как основного.



    Вобщем я хочу универсальную, прогу сочетающую в себе и консольную и графический интерфейс, возможно ли это?
     
  4. svl

    svl New Member

    Публикаций:
    0
    Регистрация:
    23 фев 2005
    Сообщения:
    46
    Адрес:
    Ukraine
    Пробуй


    Код (Text):
    1.  
    2. .486
    3. .model flat,STDCALL
    4.  
    5.     include \masm32\include\windows.inc
    6.     include \masm32\include\masm32.inc
    7.     include \masm32\include\gdi32.inc
    8.     include \masm32\include\user32.inc
    9.     include \masm32\include\kernel32.inc
    10.     include \masm32\include\Comctl32.inc
    11.     include \masm32\include\comdlg32.inc
    12.     include \masm32\include\shell32.inc
    13.     include \masm32\include\mpr.inc
    14.     include \masm32\include\netapi32.inc
    15.     include \masm32\include\wsock32.inc
    16.     include \masm32\include\winmm.inc
    17.     include \masm32\include\advapi32.inc
    18.  
    19.  
    20.     includelib \masm32\lib\masm32.lib
    21.     includelib \masm32\lib\gdi32.lib
    22.     includelib \masm32\lib\user32.lib
    23.     includelib \masm32\lib\kernel32.lib
    24.     includelib \masm32\lib\Comctl32.lib
    25.     includelib \masm32\lib\comdlg32.lib
    26.     includelib \masm32\lib\shell32.lib
    27.     includelib \masm32\lib\mpr.lib
    28.     includelib \masm32\lib\advapi32.lib
    29.     includelib \masm32\lib\winmm.lib
    30.     includelib \masm32\lib\netapi32.lib
    31.     includelib \masm32\lib\wsock32.lib
    32.    
    33.    
    34.  
    35. .data
    36.  
    37. ConsoleTitle    db "xCD",0
    38.  
    39. _open           db "Open",0
    40. _close          db "Close",0
    41.  
    42. szOpenDoor      db "set cdaudio door open wait",0
    43. szCloseDoor     db "set cdaudio door closed wait", 0
    44.  
    45. _help           db "Syntax:",0dh,0ah
    46.                 db 0dh,0ah
    47.                 db "xCD <cmd1>",0dh,0ah
    48.                 db 0dh,0ah
    49.                 db "<cmd1>:",0dh,0ah
    50.                 db "      OPEN   - Open CD-ROM",0dh,0ah
    51.                 db "      CLOSE  - Close CD-ROM",0dh,0ah,0
    52.  
    53. ind1    db 0
    54. Num     db 0
    55. cm1     db "%s",0dh,0ah,"%s",0dh,0ah,"%s",0dh,0ah,"%s",0dh,0ah,"%s",0dh,0ah,"%s", 0dh,0ah,"%s",0
    56. .data?
    57. cmdl    dd ?
    58. hOut    dd ?
    59. nWrite  dd ?
    60.  
    61. in0 db 256 dup (?)
    62. in1 db 256 dup (?)
    63. in2 db 256 dup (?)
    64. in3 db 256 dup (?)
    65. in4 db 256 dup (?)
    66. in5 db 256 dup (?)
    67. in6 db 256 dup (?)
    68.  
    69. len dd ? ; length string
    70.  
    71. outstring   db 1000 dup (?)
    72. outstr1     db 1000 dup (?)
    73. .code
    74.  
    75. start proc near
    76.    
    77.     invoke GetCommandLine
    78.     mov cmdl,eax
    79.     invoke AllocConsole
    80.     invoke SetConsoleTitle,addr ConsoleTitle
    81.     invoke GetStdHandle,STD_OUTPUT_HANDLE
    82.     mov hOut,eax
    83.    
    84.     mov esi,cmdl
    85.     call PRM
    86.    
    87.     invoke lstrcmpi,addr _open,addr in1
    88.     .if eax == 0
    89.         invoke mciSendString, addr szOpenDoor, 0, 0, 0
    90.         jmp end_CMD
    91.     .endif
    92.     invoke lstrcmpi,addr _close,addr in1
    93.     .if eax == 0
    94.         invoke mciSendString, addr szCloseDoor, 0, 0, 0
    95.         jmp end_CMD
    96.     .endif
    97.    
    98.     mov esi,offset _help
    99.     jmp output1
    100.    
    101.  end_CMD:
    102.     invoke GetLastError
    103.     mov ebx,eax
    104.     invoke FormatMessage,FORMAT_MESSAGE_FROM_SYSTEM,NULL,ebx,NULL,addr outstr1,MAX_PATH,NULL
    105.     ;invoke wsprintf,addr outstring,addr cm1,addr in0,addr in1,addr in2,addr in3,addr in4,addr in5,addr in6
    106.     invoke CharToOem,addr outstr1,addr outstring
    107.     mov esi,offset outstring
    108.  output1:
    109.     call outstr
    110.     ;invoke FreeConsole
    111.     invoke ExitProcess,NULL
    112.     ret
    113.  
    114. start endp
    115.  
    116. outstr  proc
    117.     ; esi - string to out
    118.     ; hOut HANDLE to out
    119.     invoke lstrlen,esi
    120.     invoke WriteConsole,hOut,esi,eax,addr nWrite,NULL
    121.     ret
    122.  
    123. outstr endp
    124.  
    125. PRM PROC
    126.     ; esi - string
    127.     ; in1 - in6 - params w/o "
    128.     invoke lstrlen,esi
    129.     mov len,eax
    130.     xor eax,eax
    131.     mov Num,al
    132.     mov ind1,al
    133.    
    134.     xor ebx,ebx ; for copy symb
    135.     dec ebx
    136.     mov edi,offset in0
    137.     xor ecx,ecx
    138.     dec ecx
    139.     mov al,'"'
    140.     mov ah,20h
    141.   l0:
    142.     inc ecx
    143.     cmp ecx,len
    144.     jz s_end
    145.     cmp byte ptr [esi+ecx],al
    146.     jnz l1
    147.     not ind1
    148.     jmp l0
    149.   l1:
    150.     cmp byte ptr [esi+ecx],ah
    151.     jnz l2
    152.     cmp ind1,0
    153.     jnz l2
    154.     add edi,256
    155.     xor ebx,ebx
    156.     dec ebx
    157.     jmp l0
    158.   l2:
    159.     inc ebx
    160.     mov dl,byte ptr [esi+ecx]
    161.     mov byte ptr [edi+ebx],dl
    162.     jmp l0
    163.   s_end:
    164.     ret
    165.  
    166. PRM endp
    167.  
    168. end start
    169.  










    Конечно возможно.
     
  5. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Спасибо на добром слове, буду размышлять!
     
  6. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    А строку текста для вывода в консоль, как обычно завершать нулем? и учитываеть его в кол-ве выводимых символов?
     
  7. vinnie_pooh

    vinnie_pooh New Member

    Публикаций:
    0
    Регистрация:
    30 июн 2004
    Сообщения:
    98


    Нет. Хотя удобнее написать функцию для вывода на консоль, которая сама определяет длину строки (по завершающему нулю)и затем вызывает WriteConsole. Ей можно будет передавать строки, длина которых заранее неизвестна, например, сгенерированных wsprintf.
     
  8. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Вот еще вопрос:



    Если я к примеру наберу cmd в тотал_командире, запустится cmd. Это приложение создаст консоль.



    Как мне узнать хэндл этой консоли?
     
  9. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Вот гляньте, это примерно то что я хочу,но по нормально схеме

    [​IMG] _808849784__example.wap
     
  10. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
  11. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    а .гс?

    если у тебя полный пакет винасма - там есть консольная прога на масме в examples.
     
  12. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    1. [удалено из-за изменений в мировоззрении :)]
    2. AllocConsole не нужен т.к. консоль тебе создаст система
     
  13. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
  14. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    shoo

    Не плохо,но в коде где начинается гуи версия есть FreeConsole. Ой как не нравится что она мигает задним фоном(окно консоли)



    Плюс, когда в total commander на писал example.exe asdf > 1.txt то результирующий 1.txt стал в нуле!
     
  15. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Заметь, что когда я пишу:

    ml /c /coff example > 1.txt то в 1.txt будут цопирайты!
     
  16. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    > InitCommonControls вызывай

    А толку, в Iczelion`е написано, что эта функция нужна лишь для ссылке в импорте
     
  17. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    понадобится вызывать до создания диалога при наличии там элементов типа прогресса и др., вх. в эту библиотеку, иначе диалог или не создастся ваще, или просто не будет этих контролов (если там где-то флаг выставить типа createAnyway - тчно не помню).

    блым консолью - щас перейду туда - почитаю ;) хрен его знает - я консоли не писал, надо разобраться.
     
  18. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    Но вызывать его нужно не после ExitProcess :)
     
  19. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    rmn

    Из исцелиона:

    "Вы можете вызвать comctl32.dll, поместив вызов функции IntiCommonControls в вашу программу. InitCommonControls - это функция в comctl32.dll, поэтому ее вызов в любом месте вашего кода заставит рE-загрузчик загрузить comctl32.dll, когда ваша программ запустится. Вам не нужно выполнять эту функцию, просто поместите ее где-нибудь. Эта функция ничего не делает!" урок 18.
     
  20. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    Интересно. Надо будет поглядеть.