Форум: "WinAPI";
Текущий архив: 2002.08.12;
Скачать: [xml.tar.bz2];
Вниз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 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.08.12;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.006 c