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

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

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.11.2010, 22:29   #1
Alex217Vish
Пользователь
 
Регистрация: 07.02.2009
Сообщений: 31
Вопрос Named pipes, парсинг строки

Visual C++ 2010.
Задача: из программы на C# передать некий список файлов в программу на C++. Передаётся строка вида "Путь_к_файлу\nПуть_к_файлу\nПуть_к _файлу". В C++ строка считывается и парсится, разделяясь на массив строк, где каждая строка - имя файла. Код на C# отрабатывает нормально (передаёт в именованный канал форматированную строку), а вот при чтении информации с C++ возникают проблемы.
Вот код:
Код:
	wchar_t **data = NULL;
	HANDLE pipe = CreateNamedPipe(PipeName, PIPE_ACCESS_INBOUND, PIPE_WAIT, 1, 0, 0, 0, NULL);
	if (pipe != INVALID_HANDLE_VALUE)
	{
		if (ConnectNamedPipe(pipe, NULL))
		{
			DWORD fileSize = GetFileSize(pipe, NULL);
			if (fileSize != INVALID_FILE_SIZE)
			{
				DWORD numberOfBytesRead = fileSize;
				wchar_t *buffer = new wchar_t[numberOfBytesRead];
				if (ReadFile(pipe, &buffer, numberOfBytesRead, &numberOfBytesRead, NULL))
				{
					if (numberOfBytesRead == 0)
					{
						cout << "Error: " << "Can not read data";
					}
					else
					{
						int k = 0;
						int l = 0;
						data = (wchar_t **)malloc(sizeof(wchar_t*));
						data[k] = (wchar_t *)malloc(sizeof(wchar_t));
						for (int i = 0; i < numberOfBytesRead; i++)
						{
							wchar_t ch = buffer[i];
							if (ch != '\n')
							{
								data[k] = (wchar_t *)realloc(data[k], _msize(data[k]) + sizeof(wchar_t));
								data[k][l] = ch;
								l++;
							}
							else
							{
								k++;
								l = 0;
								data = (wchar_t **)realloc(data, _msize(data) + sizeof(wchar_t*));
							}
						}
					}
				}
				else cout << "Can not read file. Error: " << GetLastError();
			}
			else cout << "Error: " << "Invalid file size";
			DisconnectNamedPipe(pipe);
		}
		else cout << "Can not connect to pipe. Error: " << GetLastError();
	}
	else
	{
		cout << "Can not create pipe. Error: " << GetLastError();
	}
	CloseHandle(pipe);
Вылетает исключения, указывающее на строку wchar_t ch = buffer[i], текст исключения "Unhandled exception at 0x010a10e2 in TransferAgent.Test.Native.exe: 0xC0000005: Access violation reading location 0x0a656e4f."
Ззаметил, что есть проблема с GetFileSize - оно почему-то возвращает различные значения при одних и тех же данных, отсюда скорее всего и ошибка.
Вопрос: почему так себя ведёт GetFileSize и в чём моя ошибка при работе с памятью?
P.S. уничтожение данных пока не делаю, так как после их вывода программу закрываю.
Alex217Vish вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
named pipes st01en Общие вопросы Delphi 1 26.09.2010 23:33
Парсинг следующей строки Fok Общие вопросы Delphi 4 12.09.2010 17:26
использование named Pipe Sparky Общие вопросы .NET 1 29.03.2010 17:54
Парсинг строки beemoto Общие вопросы Delphi 18 12.04.2009 18:52