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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.05.2010, 11:18   #1
capta1n
Форумчанин
 
Аватар для capta1n
 
Регистрация: 06.12.2008
Сообщений: 613
По умолчанию NamedPipe & WriteFile

Доброго времени суток, специалисты.
Подскажите, пожалуйста, в чем может быть ошибка в данном коде, не могу понять, что делаю неправильно:

Код:
//создаю именованный пайп
NamedPipe = CreateNamedPipe(PipeName, PIPE_ACCESS_OUTBOUND, PIPE_TYPE_BYTE | PIPE_NOWAIT, 1, 0, 0, NMPWAIT_USE_DEFAULT_WAIT, lpSAPIPE);
//если ошибка (неправильное значение описателя), пишем об этом
	if (NamedPipe==INVALID_HANDLE_VALUE){
		std::cout << "Error of creating named pipe" << std::endl;
		std::cout << "Stop process" <<std::endl;
		Sleep(3000);
		ExitProcess(1);
	}
	else
		std::cout << "Pipe has been successfully created" << std::endl;
	Sleep(1000);
//пишем в пайп
	std::cout << "Writing named pipe" << std::endl;
//проверяем успешность записи
//если неправильно - сообщаем об этом
	if (WriteFile(NamedPipe, &FCData[0], MaxSize, &WrSize, lpOverLapped)==FALSE){
		std::cout << "Error writing into pipe" << std::endl;
		std::cout << "Stop process" <<std::endl;
		Sleep(3000);
		ExitProcess(1);
	}
теперь кратко о переменных:
Код:
HANDLE NamedPipe; /описатель канала
LPTSTR PipeName = "\\\\.\\pipe\\datapipe"  // имя канала, имеет определенную структуру
LPSECURITY_ATTRIBUTES lpSAPIPE = NULL;  // указатель на структуру безопасности
LPTSTR FCData //блок данных, которые я передаю, представляет собой массив символов определенной длины
DWORD MaxSize //размер в байтах передаваемых данных, в моей
//программе равно 30
DWORD WrSize // переменная для счета записанных данных, она не NULL,
// так как pipe создавался без флага FILE_FLAG_WRITE_THROUGH, а значит следующий параметр NULL, то есть 
LPOVERLAPPED lpOverLapped = NULL // параметр, необходимый при вызове пайпа с флагом FILE_FLAG_WRITE_THROUGH
Проблема в том, что пайп создает успешно, и его описатель не нулевой и не INVALID_HANDLE_VALUE.
После успешного создания, функция WriteFile возвращает FALSE
Не понимаю почему
Помогите

Последний раз редактировалось capta1n; 30.05.2010 в 11:21.
capta1n вне форума Ответить с цитированием
Старый 01.06.2010, 18:59   #2
liljon
Форумчанин
 
Регистрация: 03.01.2010
Сообщений: 229
По умолчанию

После того, как был создан пайп, я вставил эту функцию, и незнаю почему, но заработало WriteFile, причем через тот же указатель, что и при создании пайпа
Код:
	CreateFile(\\\\.\\pipe\\datapipe,GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
подпись
liljon вне форума Ответить с цитированием
Старый 02.06.2010, 14:37   #3
capta1n
Форумчанин
 
Аватар для capta1n
 
Регистрация: 06.12.2008
Сообщений: 613
По умолчанию

спасибо, я уже разобрался, кстати ты очень острый, намек поразил меня до глубины души, особенно:

Код:
#include <telepat.h>
capta1n вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Странное поведение WriteFile / WriteFileEx (асинхронный I/O) besserebrenik Win Api 0 22.02.2010 20:37
Файл падает после WriteFile --=SaNitinDG=- Общие вопросы C/C++ 6 15.02.2010 20:20
TForm & TImage & PNG & Прозрачность delphi_beginner Общие вопросы Delphi 7 19.09.2009 08:46
Альтернатива WriteFile Egor2005 Win Api 3 11.04.2007 20:11