![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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