Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.11.2011, 19:54   #1
RAZOR1703
Пользователь
 
Регистрация: 15.12.2010
Сообщений: 74
По умолчанию Анонимные каналы

И снова всем привет. На сей раз я пожаловал с каналами.
Задание такое: первый процесс должен пересылать строку во второй процесс по анонимному каналу, а второй - обратно на первый. То бишь, 1 -> 2, 2 -> 1.
Первый процесс переворачивает строку задом наперед, а второй делает ее заглавными буквами. И, вроде как, нужны два канала, т.к. анонимный обеспечивает передачу только в одном направлении.
Но проблема вот в чем: у меня получается своего рода петля. Поскольку используется стандартный ввод-вывод, я понять не могу, куда мне вводить-то, собственно, эту строку.
Код - вот он.

PipeA.cpp
Код:
#include <windows.h>
#include <iostream>

using namespace std;

char szBuf[256];
DWORD dwRead, dwWritten;
HANDLE hStdin, hStdout;
BOOL fSuccess;

int main ()
{
	hStdout = GetStdHandle (STD_OUTPUT_HANDLE);
	hStdin = GetStdHandle (STD_INPUT_HANDLE);
	if ( (hStdout == INVALID_HANDLE_VALUE) || (hStdin == INVALID_HANDLE_VALUE) )
		ExitProcess(1);
	int i, j;
	for(;;)
	{
		fSuccess = ReadFile (hStdin, szBuf, 256, &dwRead, NULL);
		if (!fSuccess || dwRead == 0)
			break;
		for (i = 0, j = dwRead-2; i<j; i++, j--)
		{
			char c = szBuf[i]; 
			szBuf[i] = szBuf[j];
			szBuf[j] = c;
		}

		fSuccess = WriteFile (hStdout, szBuf, dwRead, &dwWritten, NULL);
		if (!fSuccess)
			break;
	}
	ExitProcess (0);
	return 0;
}

PipeB.cpp
Код:
#include <windows.h>
#include <iostream>

using namespace std;

char szBuf[256];
DWORD dwRead, dwWritten;
HANDLE hStdin, hStdout;
BOOL fSuccess;

int main ()
{
	hStdout = GetStdHandle (STD_OUTPUT_HANDLE);
	hStdin = GetStdHandle (STD_INPUT_HANDLE);
	if ( (hStdout == INVALID_HANDLE_VALUE) || (hStdin == INVALID_HANDLE_VALUE) )
		ExitProcess (1);
	for (;;)
	{
		fSuccess = ReadFile (hStdin, szBuf, 256, &dwRead, NULL);
		if (!fSuccess || dwRead == 0)
			break;
		CharUpperBuff (szBuf, strlen (szBuf));
		fSuccess = WriteFile (hStdout, szBuf, dwRead, &dwWritten, NULL);
		if (!fSuccess)
			break;
	}
	ExitProcess (0);
	return 0;
}
Launcher.cpp (создает каналы и запускает сами процессы)
Код:
#include <iostream>
#include <windows.h>
#include <stdio.h>
#include <conio.h>
using namespace std;

HANDLE hFirstToSecondRead, hFirstToSecondWrite, 
	   hSecondToFirstRead, hSecondToFirstWrite;

HANDLE Proc[2];
int ProcessCount = 0;

int CreatePipeProcess (LPTSTR, HANDLE, HANDLE, DWORD);

int main()
{
	SECURITY_ATTRIBUTES saAttr;
	saAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
	saAttr.bInheritHandle = TRUE;
	saAttr.lpSecurityDescriptor = NULL;
	if ( !CreatePipe (&hFirstToSecondRead, &hFirstToSecondWrite, &saAttr, 512) )
	{
		cout << "Error while creating first pipe" << endl;
		getch();
		return 0;
	}

	if ( !CreatePipe (&hSecondToFirstRead, &hSecondToFirstWrite, &saAttr, 512) )
	{
		cout << "Error while creating second pipe" << endl;
		getch();
		return 0;
	}

	CreatePipeProcess ("PipeA.exe", hSecondToFirstRead, hFirstToSecondRead, CREATE_NEW_CONSOLE);
	CreatePipeProcess ("PipeB.exe", hSecondToFirstRead, hFirstToSecondRead, CREATE_NEW_CONSOLE);
	DWORD retCode = WaitForMultipleObjects (ProcessCount, Proc, TRUE, INFINITE);
	if ( retCode )
	{
		DWORD errCode = GetLastError();
		errCode++;
		return errCode--;
	}

	for (int i = 0; i < ProcessCount; ++i)
		CloseHandle (Proc[i]);
	CloseHandle (hFirstToSecondRead);
	CloseHandle (hFirstToSecondWrite);
	CloseHandle (hSecondToFirstRead);
	CloseHandle (hSecondToFirstWrite);
	return 0;
}
	
int CreatePipeProcess (LPTSTR name, HANDLE Input, HANDLE Output, DWORD CreationFlag)
{
	STARTUPINFO si;
	PROCESS_INFORMATION pi;
	ZeroMemory (&si, sizeof(si));
	si.hStdInput = Input;
	si.hStdError = GetStdHandle (STD_ERROR_HANDLE);
	si.hStdOutput = Output;
	si.dwFlags = STARTF_USESTDHANDLES;
	si.cb = sizeof (si);
	ZeroMemory (&pi, sizeof (pi));
	if ( !CreateProcess (NULL, name, NULL, NULL, TRUE, CreationFlag, NULL, NULL, &si, &pi) )
	{
		printf ("Error while starting PipeA.exe\n");
		_getch ();
		return false;
	}
	if ( CreationFlag == CREATE_NEW_CONSOLE )
		Proc[ProcessCount] = OpenProcess ( PROCESS_ALL_ACCESS, FALSE,
			pi.dwProcessId );
	else 
		Proc[ProcessCount] = pi.hProcess;
	CloseHandle (pi.hThread);
	++ProcessCount;
	return true;
}
В общем, хотелось бы каких-нибудь объяснений
RAZOR1703 вне форума Ответить с цитированием
Старый 29.11.2011, 21:47   #2
RAZOR1703
Пользователь
 
Регистрация: 15.12.2010
Сообщений: 74
По умолчанию

Ну кто-нибудь.
RAZOR1703 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как вывести звук с браузера на все каналы звуковой платы? 198JONNY Операционные системы общие вопросы 3 24.05.2011 16:35
Twebbrowser и анонимные proxy vasiliy_09_05 Работа с сетью в Delphi 1 24.02.2011 17:11
Переключение каналов через пульт на 2-3 значные каналы sSsantasSs JavaScript, Ajax 71 07.07.2010 20:17
Межпроцессное взаимодействие. Каналы. Zefick Win Api 3 02.03.2009 20:48