Помогите с консольным приложением
От: dbondar Украина  
Дата: 22.06.06 16:12
Оценка:
Зараннее извиняюсь, но уже защел в тупик.
Дело вот в чем. Имеется консольное приложение, для которого необходимо написать GUI.
Сначала пробовал через pipes — работает только чтение из консольного приложения в TMemo, а запись из TEdit в консольное приложение не производится. С другими консольными приложениями (к примеру cmd.exe) все работает. Пришел к выводу, что стандартный ввод тут ни при делах совсем. Консольное приложение требует нажатия клавиш на клавиатуре. Подсказали функцию WriteConsoleInput и тут я столкнулся с проблемой!
Для начала фрагмент кода (ненужное не показано).

PROCESS_INFORMATION pi;

void __fastcall TForm1::FormCreate(TObject *Sender)
{
  STARTUPINFO si;
  memset(&si,0,sizeof(si));
  GetStartupInfo(&si);
  si.hStdInput = GetStdHandle(STD_INPUT_HANDLE);

  CreateProcess(NULL, "c:\\windows\\system32\\cmd.exe", NULL, NULL, TRUE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);

  HANDLE hStdIn = GetStdHandle(STD_INPUT_HANDLE);

  hStdIn == INVALID_HANDLE_VALUE);
  si.dwFlags = STARTF_USESTDHANDLES|STARTF_FORCEONFEEDBACK;
  si.wShowWindow = SW_NORMAL;
  
  // !!!!!!!!!!!
  Sleep(1000);
  
  si.cb = sizeof(si);
  AttachConsole(pi.dwProcessId);
}

void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose)
{
  CloseHandle(pi.hThread);
  CloseHandle(pi.hProcess);
  FreeConsole;  
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  HANDLE InpHdl;
  INPUT_RECORD ir;
  DWORD N;
  InpHdl = GetStdHandle(STD_INPUT_HANDLE);
  ir.EventType = KEY_EVENT;
  ir.Event.KeyEvent.wRepeatCount = 1;
  ir.Event.KeyEvent.uChar.AsciiChar = 'a';
  ir.Event.KeyEvent.bKeyDown = true;
  WriteConsoleInput(InpHdl, &ir, 1, &N);
  ir.Event.KeyEvent.bKeyDown = false;

}


Проблема в следующем: Если убрать строку Sleep(1000); то консольное приложение запустится после создания вормы, и вывести в консоль ничего не удается.
В идеале нужно запускать консольное приложение скрытым и не при старте программы, а при определенном событии (нажатии кнопки на форме).
Подскажите мою ошибку. Буду очень благодарен!!!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.