Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Console redirect


Rurik ©   (2002-06-06 12:23:00) 

Как перенаправить вывод консольного приложения в экранный элемент на форме -
например в Memo ?


Rurik   (2002-06-07 11:40:00) [1]

>Что GetLastError говорит ?
998 - Неверная попытка доступа к адресу памяти


Игорь Шевченко   (2002-06-07 10:01:00) [2]

var FBuffer : Pointer;
xSize : DWORD;

const FBufSize = 65535;

rc := ReadFile (hPipe, FBuffer^, FBufSize, xSize, nil);

Может быть, в этот pipe никто не пишет ?
Что GetLastError говорит ?


Rurik   (2002-06-06 17:34:00) [3]

и все же нельзя ли привести пример как мне прочитать из полученного Pipe ?
функция
res := ReadFile(hRead, aa, 255, dwBytesRead, nil) ;
возвращает всегда False
aa : array[0..255] of char ;


Игорь Шевченко   (2002-06-06 15:23:00) [4]

Нет, CloseHandle(hWrite) уже выдан, она закроется и уничтожится по завершению порожденного процесса


Rurik   (2002-06-06 15:15:00) [5]

а закрывать(уничтожать) Pipe не нужно ?


Игорь Шевченко   (2002-06-06 14:37:00) [6]

vector в данном случае - изврат, IMHO.
Про CloseHandle правильно говорят, по хорошему, их незакрытие может привести к утечке системных ресурсов, если основной процесс живет на машине вечно. Если не вечно, и не делать CloseHandle, то ресурсы будут возвращены системе в момент закрытия как основного, так и порожденного процессов


Rurik   (2002-06-06 13:33:00) [7]

Вот нашел пример на С++ почти все понятно кроме аналогов на Delphi
1) CloseHandle - при невызове грозят неприятностями
2) аналог их векторов , т.е. как читать из полученного пайпа ?


#include
#include
using namespace std;

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
// Создаём пайп.
SECURITY_ATTRIBUTES sa;
ZeroMemory(&sa, sizeof(sa));
sa.nLength = sizeof(sa);
sa.bInheritHandle = TRUE;
HANDLE hRead, hWrite;
if(!::CreatePipe(&hRead, &hWrite, &sa, 0))
return 1;
// Создаём процесс, перенаправляя его вывод в наш пайп.
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.hStdOutput = hWrite;
si.dwFlags = STARTF_USESTDHANDLES | STARTF_USECOUNTCHARS;
si.dwXCountChars = si.dwYCountChars = 1;
::CreateProcess(
"hello.exe", // или любая другая программа
NULL,
NULL,
NULL,
TRUE,
0,
NULL,
NULL,
&si,
&pi);
// Закрываем хэндлы!!! Иначе возможны неприятности.
CloseHandle(hWrite);
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
// Читаем из пайпа в std::vector.
// Это можно делать в отдельном потоке, если дочерний процесс
// работает долго.
char temp[255];
vector result;
DWORD dwBytesRead;
while(1)
{
if (!::ReadFile(hRead, temp, 255, &dwBytesRead, NULL) || !dwBytesRead)
break;
result.insert(result.end(), temp, temp+dwBytesRead);
}
CloseHandle(hRead);
// Все байты загружены в вектор result.
// Можно делать с ними что угодно, например, вывести на экран.
result.push_back("\0");
printf(result.begin());
return 0;
}


Song   (2002-06-06 13:00:00) [8]

CreatePipe()


Rurik   (2002-06-06 12:48:00) [9]

что это такое и где искать? есть ли какой примерчик ?


VuDZ   (2002-06-06 12:41:00) [10]

named pipes


Наверх

Титульная страница Поиск, карта сайта Написать письмо