Trzeba kombinować samodzielnie, a nie czekać na gotowe. Krótki opis tego, co powinieneś zrobić:
- stwórz potoki funkcją
CreatePipe
- wypełnij strukturę
STARTUPINFO
. Pisałem jak, zresztą masz przykład z linka.
- odpal proces funkcją
CreateProcess
, podając w argumencie wypełnioną wcześniej strukturę STARTUPINFO
.
- Funkcjami
ReadFile
i WriteFile
odbierasz i wysyłasz dane. Jako uchwyt do pliku podajesz stworzony wcześniej uchwyt do potoku. Oczywiście komunikacja odbywa się na poziomie binarnym, więc nie będzie tak prosto, jakbyś używał sformatowanych strumieni C/C++. Wprawdzie niektóre biblioteki C umożliwiają przestawienie potoków, ale nie zawsze to działa. Sensowniej byłoby zaimplementować własną wersję streambuf
dla strumieni istream
i ostream
.
--- dodane ---
Przypomniało mi się, że kiedyś implementowałem streambuf właśnie na potrzebę obsługi zewnętrznych potoków:
class pipe_streambuff: public std::streambuf
{
private:
char m_gbuff[512];
HANDLE m_read_pipe;
HANDLE m_write_pipe;
protected:
int underflow()
{
DWORD chRead = 0;
if(ReadFile(m_read_pipe, m_gbuff, sizeof(m_gbuff), &chRead, NULL) == TRUE)
{
setg(m_gbuff, m_gbuff, m_gbuff + chRead);
return sgetc();
}
return EOF;
}
int overflow (int c = EOF)
{
DWORD cbWritten = 0;
BOOL res = WriteFile(m_write_pipe, &c, 1, &cbWritten, NULL);
setp(0, 0, 0);
return res == TRUE ? 0 : -1;
}
public:
pipe_streambuff(HANDLE in_, HANDLE out_)
:m_read_pipe(in_), m_write_pipe (out_)
{
setg(m_gbuff, m_gbuff, m_gbuff);
setp(0, 0, 0);
}
};
Użycie:
/* podłączam standardowe potoki, Ty będziesz musiał użyć tych stworzonych funkcją CreatePipe */
HANDLE stdIn = GetStdHandle(STD_INPUT_HANDLE);
HANDLE stdOut = GetStdHandle(STD_OUTPUT_HANDLE);
auto_ptr<pipe_streambuff> buf(new pipe_streambuff(stdIn, stdOut));
istream is(buf.get());
ostream os(buf.get());
int n;
is >> n;
os << n << "test\n";