Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.08.12;
Скачать: CL | DM;

Вниз

Console redirect   Найти похожие ветки 

 
Rurik   (2002-06-06 12:23) [0]

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


 
VuDZ ©   (2002-06-06 12:41) [1]

named pipes


 
Rurik   (2002-06-06 12:48) [2]

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


 
Song ©   (2002-06-06 13:00) [3]

CreatePipe()


 
Rurik   (2002-06-06 13:33) [4]

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


#include <windows.h>
#include <vector>
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<char> 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;
}


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

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


 
Rurik   (2002-06-06 15:15) [6]

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


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

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


 
Rurik   (2002-06-06 17:34) [8]

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


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

var FBuffer : Pointer;
xSize : DWORD;

const FBufSize = 65535;

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

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2002.08.12;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.014 c
4-35530
rdm
2002-06-04 12:43
2002.08.12
Закрыть игру


7-35488
Timon
2002-05-27 14:40
2002.08.12
---|Ветка была без названия|---


1-35246
Schummi
2002-07-20 10:53
2002.08.12
wm_mousemove


6-35394
Shadow
2002-05-27 19:34
2002.08.12
READ&WRITE


1-35358
nikolo
2002-07-30 10:31
2002.08.12
clCream is not a valid integer value ?