Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с Ctrl-c 
:(
    Опции темы
jecl
Дата 28.1.2010, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 12.10.2007

Репутация: нет
Всего: нет



Всем привет.
Есть проект xCmd - выполнение команд на удаленной вин машине.
http://www.google.com/codesearch/p?hl=ru#s...md.h&q=xcmd

Как работает
При запуске xCmd происходит логин на удаленную машину с поднятием xCmdSvc - сервиса, который и будет выполнять команды.
Т.е. при выполнении xCmd \\localhost cmd
На удаленной машине запускается cmd.exe, весь отпут форвардится к нам, весь инпут - на удаленную машину.
Реализовано с помощью пайпов. Т.е. xCmdSvc открывает три пайпа на err, in, out(создается процесс с этими пайпами, тот самый cmd.exe). xCmd коннектится к пайпам и непосредственно общается с процессом запущенным xCmdSvc.

Все неплохо, есть одно но. При отправке ctrlc на in pipe ничего не происходит. текущая команда выполняемая в cmd(ping localhost к примеру) не прерывается. Если же отослать ctrlc ничего не делающему cmd, а затем нажать enter выводится символ сердечка:(

Решил сделать эксперимент в виде такого кода:
Код

#include <windows.h>
#include <iostream.h>
#include <string>
#include <conio.h>

BOOL WINAPI xCmdConsoleCtrlHandler( DWORD dwCtrlType )
{
   switch( dwCtrlType )
   {
   case CTRL_C_EVENT:
   case CTRL_BREAK_EVENT:
       std::cout << "Got Ctrl-C event!"<< std::endl;
       exit(0);
      break;
   }

   return TRUE;
}

int main ( void )
{
    std::string word = "";
    SetConsoleCtrlHandler( xCmdConsoleCtrlHandler, TRUE );
    while(word != "exit"){
        char ch = _getche();
        if(ch == 3){
            HANDLE stdInput = GetStdHandle(STD_INPUT_HANDLE);
            byte ctrlC[] = {(byte)0x003};
            DWORD nBytesWrote;
            WriteFile( stdInput, ctrlC, sizeof ctrlC, &nBytesWrote, NULL );
            continue;
        }

        std::cout << "Typed: " << ch << std::endl;

    }

  return 0;
}



Так вот при нажатии ctrlс ничего не происходит(кроме вывода сердечек).
Почему?


PM MAIL   Вверх
jonie
Дата 29.1.2010, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 7
Всего: 118



Цитата

byte ctrlC[] = {(byte)0x003};
а откуда это магическое число  ?
Ctrl+C не генерирует 3, т.е. может оно так и приходит куда-то там, но помимо 3-ки есть и еще вещи, которые делает Ctrl+C ....


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
jecl
Дата 29.1.2010, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 12.10.2007

Репутация: нет
Всего: нет



Никакой магии
ctrl-C, он же ETX = 03
ASCII codes
Цитата

Ctrl+C не генерирует 3, т.е. может оно так и приходит куда-то там, но помимо 3-ки есть и еще вещи, которые делает Ctrl+C 

Тогда вопрос в том что помимо отсылки тройки надо еще сделать?

Т.е. изначальная задача по имеющемуся пайпу (пайп представляет собой стдИн)передать Ctrl-C.
Данный пример упрощение, но для начала хотелось бы добиться что бы он работал.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0681 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.