В одном процессе создать две консоли

Тема в разделе "WASM.BEGINNERS", создана пользователем XshStasX, 23 июн 2010.

  1. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    Как создать две консоли в одном процессе?
    Я так понимаю нужно делать два процесса?
    Задача такова:
    В одной консоли ловятся события мыши, а в другом они отображаются?
     
  2. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    XshStasX,

    Нужна именно вторая консоль? Один процесс так не может.

    А ListBox или многострочный Edit для отображения событий не подойдёт?
     
  3. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    да нужна именно консоль...
    Ладно придется делать вторую прогу, чтоб в ее консоль писать.
     
  4. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    А есть функции для работы с "чужой" консолью, но при этом чтоб и "своей" пользоваться можно было?
    Или нужны пайпы ??
     
  5. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    XshStasX,

    Ещё раз: одновременно консоль у процесса может быть только одна. Прицепиться к чужой консоли можно, но для этого надо освободить текущую (FreeConsole() / AttachConsole()).

    Связь между процессами можно реализовать по разному, в том числе и пайпом. Можно вообще без коммуникаций, наверное: назапускать нужное количество консольных заглушек, которые просто ждут ивента и выходят, а в основной программе хватать попеременно их консоли и рулить.
     
  6. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    csrss не поддерживает создание более одной консоли на процесс. Кстати говоря, консоль AllocConsole() "не совсем такая", как "родная", которую он получает при старте процесса с SubSystem == IMAGE_SUBSYSTEM_WINDOWS_CUI.

    Тебе не нужна консоль, тебе пойдут обычные окна. Нарисуешь красиво, похоже на консоль - все поверят :lol:
     
  7. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    суррогат
    http://www.codeproject.com/KB/cpp/MultipleConsoles.aspx
     
  8. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    В общем может кому то пригодится, код.
    Программа состоит из двух частей, первая(сервер) шлет второй(клиенту) программе данные, и клиент их обрабатывает и отображает.
    Сервер запускает клиента.
    Сервер шлет программе клиенту, данные о состоянии кнопок мыши.

    Клиент:
    Код (Text):
    1.     .386
    2.     .model flat,stdcall
    3.     option casemap:none
    4.     include \masm32\include\windows.inc
    5.     include \masm32\include\user32.inc
    6.     include \masm32\include\kernel32.inc
    7.     include \masm32\include\masm32.inc
    8.    
    9.     includelib \masm32\lib\user32.lib
    10.     includelib \masm32\lib\kernel32.lib
    11.     includelib \masm32\lib\masm32.lib
    12. TPOINT STRUCT
    13.  X WORD ?
    14.  Y WORD ?
    15. TPOINT ENDS    
    16.  
    17. MOUSE_EVENT_RECORD_ STRUCT
    18.   X                     WORD        ?
    19.   Y                     WORD        ?
    20.   dwButtonState         DWORD      ?
    21.   dwControlKeyState     DWORD      ?
    22.   dwEventFlags          DWORD      ?
    23. MOUSE_EVENT_RECORD_ ENDS
    24.  
    25. .const
    26.  pipe_name  db "\\.\pipe\console_pipe",0
    27.  event_exit db "event_exit",0
    28.  
    29. ;_______________
    30.   X            db "X:",0
    31.   Y            db "Y:",0
    32.   Left1        db "levaya knopka",0
    33.   Left2        db "srednay knopka",0;
    34.   Left3        db "FROM_LEFT_3RD_BUTTON_PRESSED",0
    35.   Left4        db "FROM_LEFT_4TH_BUTTON_PRESSED",0
    36.   Left5        db "pravaya knopka  ",0
    37.   ClickDouble  db "2 click",0;
    38.   MouseHEELED  db "MOUSE_HWHEELED",0;
    39.   MouseMoved   db "move mouse",0;
    40.   MouseWHEELED db "koleso prokrucheno",0;
    41.  
    42. ;_______________
    43. .data?
    44.  Point TPOINT  <0>;
    45.  Mouse MOUSE_EVENT_RECORD_  <0>
    46.  
    47.  hPipe HANDLE <0>;
    48.  t   dword 0;
    49. .data
    50.  
    51. .code
    52.  
    53.  
    54. print_str proc
    55.  push ebp
    56.  mov ebp,esp
    57.  add esp,-4
    58.   ; ebp -4 ; temp
    59.   ; ebp + 12 buf
    60.   ;ebp +8 hout
    61.  push edi
    62.  push ecx
    63.  mov ecx,255
    64.  mov eax,0
    65.  lea edi,[ebp+12]
    66.  mov edi,[edi]
    67.  repnz scasb
    68.  sub edi,[ebp+12]
    69.  lea eax,[ebp-4]
    70.   push eax
    71.   push Point
    72.   push edi
    73.   push [ebp+12]
    74.   push [ebp+8]
    75.  call WriteConsoleOutputCharacter
    76.  mov eax,[ebp-4]
    77.  inc Point.Y
    78.  pop ecx
    79.  pop edi
    80.  add esp,4
    81.  pop ebp
    82.  ret 8
    83. print_str endp
    84.  
    85. mouse_proc proc
    86.  push ebp
    87.  mov ebp,esp
    88.   mov [Point.Y],0
    89.   mov eax,[Mouse.dwButtonState]
    90.   and eax,FROM_LEFT_1ST_BUTTON_PRESSED
    91.   jz @L1
    92.   push offset Left1
    93.   push [ebp+8]
    94.   call print_str
    95.  @L1:
    96.   mov eax,[Mouse.dwButtonState]
    97.   and eax,RIGHTMOST_BUTTON_PRESSED
    98.   jz @L2
    99.   push offset Left5
    100.   push [ebp+8]
    101.   call print_str
    102.  @L2:
    103.   mov eax,[Mouse.dwButtonState]
    104.   and eax,FROM_LEFT_2ND_BUTTON_PRESSED
    105.   jz @L3
    106.   push offset Left2
    107.   push [ebp+8]
    108.   call print_str
    109.  @L3:
    110.   mov eax,[Mouse.dwButtonState]
    111.   and eax,FROM_LEFT_3RD_BUTTON_PRESSED
    112.   jz @L4
    113.   push offset Left3
    114.   push [ebp+8]
    115.   call print_str
    116.  @L4:
    117.   mov eax,[Mouse.dwButtonState]
    118.   and eax,FROM_LEFT_4TH_BUTTON_PRESSED
    119.   jz @L5
    120.   push offset Left4
    121.   push [ebp+8]
    122.   call print_str
    123.  @L5:
    124.   mov eax,[Mouse.dwEventFlags]
    125.   and eax,8
    126.   jz @L6
    127.   push offset MouseHEELED
    128.   push [ebp+8]
    129.   call print_str
    130.  @L6:
    131.   mov eax,[Mouse.dwEventFlags ]
    132.   and eax,DOUBLE_CLICK
    133.   jz @L7
    134.   push offset ClickDouble
    135.   push [ebp+8]
    136.   call print_str
    137.  @L7:
    138.   mov eax,[Mouse.dwEventFlags ]
    139.   and eax,MOUSE_MOVED
    140.   jz @L8
    141.   push offset MouseMoved
    142.   push [ebp+8]
    143.   call print_str
    144.  @L8:
    145.    mov eax,[Mouse.dwEventFlags ]
    146.   and eax,4
    147.   jz @L9
    148.   push offset MouseWHEELED
    149.   push [ebp+8]
    150.   call print_str
    151.  @L9:
    152.  pop ebp
    153.  ret 4
    154. mouse_proc endp
    155.  
    156. start:
    157. mov ebp,esp
    158. add esp,-8
    159. call AllocConsole
    160. push STD_OUTPUT_HANDLE
    161. call GetStdHandle
    162. mov [ebp-4],eax
    163. push 1000
    164. call Sleep
    165.   push 0
    166.   push FILE_ATTRIBUTE_NORMAL
    167.   push OPEN_EXISTING
    168.   push 0
    169.   push 0
    170.   push GENERIC_READ
    171.   push offset pipe_name
    172.   call CreateFile
    173.   cmp eax,INVALID_HANDLE_VALUE
    174.   je @exit1
    175.   mov [hPipe],eax
    176.  @main:
    177.    push 0
    178.    push offset t
    179.    push sizeof MOUSE_EVENT_RECORD
    180.    push offset Mouse
    181.    push [hPipe]
    182.    call ReadFile
    183.    cmp eax,0
    184.    je @exit
    185.     lea eax,[ebp-8]
    186.     push eax
    187.     push 0
    188.     push 1000
    189.     push 32
    190.     push [ebp-4]
    191.     call FillConsoleOutputCharacter
    192.    push [ebp-4]
    193.    call mouse_proc
    194.   jmp @main
    195. @exit:
    196.    push [hPipe]
    197.    call CloseHandle
    198. @exit1:  
    199. add esp,8
    200. push 0
    201. call ExitProcess
    202. end start
    Сервер:
     
  9. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    Буду рад если кто-то укажет как этот код можно было сделать,лучше.
    П.С не заботился о очистке ресурсов.
     
  10. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    Пожалуй, кое что можно предложить.

    Есть ли какой-то тайный смысл в том, чтобы линковать программу как GUI и в самом начале делать AllocConsole()? Для консольной программы по понятным причинам вызов обломится.

    WriteConsoleOutputCharacter() использует стандартную структуру COORD (есть в Windows.Inc из MASM32), незачем изобретать некий TPOINT. MOUSE_EVENT_RECORD там тоже есть. Необходимо учесть, однако, что при передаче структуры в функцию «по значению» она копируется в стэк целиком.

    Объявления переменных типа hPipe HANDLE <0> в секции неинициализированных данных не дают подразумеваемого эффекта (в смысле неинициализированности).

    .data и следом .code, хоть и не влияют на качество, немного сбивают с толку.

    Ручная адресация от ebp без объявления хотя бы equ-символов сбивают с толку ещё хуже: ладно бы следить за esp в функции с FPO, но тут-то можно воспользоваться возможностями ассемблера для улучшения читаемости?

    Можно считать что это — мелочи. :derisive:
     
  11. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    Что такое equ символы ?

    масм ругался на подобное : Mouse MOUSE_EVENT_RECORD <0>
    вот такой ошибкой: initialize must be a string or single item
    Как устранить ошибку, не понял сделал так как получилось)).

    Да, но указатель и структура равны 4 байта ;).
    Хотя на x64 лучше передать указатель, да?