Зараннее извиняюсь, но уже защел в тупик.
Дело вот в чем. Имеется консольное приложение, для которого необходимо написать 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); то консольное приложение запустится после создания вормы, и вывести в консоль ничего не удается.
В идеале нужно запускать консольное приложение скрытым и не при старте программы, а при определенном событии (нажатии кнопки на форме).
Подскажите мою ошибку. Буду очень благодарен!!!