Member 12147362 Ответов: 1

Ошибка подключения именованных каналов C# C++


Я пытаюсь соединить проект c# с проектом c++ с помощью именованных каналов, но проект c++ не соединяется.

ps: файл. exe находится в одном файле

Вот мой код может быть вы сможете обнаружить ошибку

Сервер C# :

Программа. cs

namespace csharptestpipes
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>

        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            pipeHandler pipe = new pipeHandler();

          var proc = new Process();
          proc.StartInfo.FileName = "cplpltestpipes.exe";
          proc.Start();

            pipe.establishConnection();

            Application.Run(new Form1(pipe));
        }
    }


    public class pipeHandler
    {
        private StreamReader re;
        private StreamWriter wr;
        private NamedPipeServerStream pipeServer;

        public pipeHandler()
        {
            //We now create the server in the constructor.
            pipeServer = new NamedPipeServerStream("myNamedPipe1");
        }

        public void establishConnection()
        {
            //pipeServer.WaitForConnection();
            re = new StreamReader(pipeServer);
            wr = new StreamWriter(pipeServer);
        }
        public void writePipe(string text)
        {
            wr.Write(text);
        }

        public string readPipe()
        {
                string s;
                s = re.ReadToEnd();
                return s;
        }

        public void closeConnection()
        {
            pipeServer.Close();
        }
    }
}


Форма 1. cs:

public partial class Form1 : Form
    {
        pipeHandler pipePointer;
        public Form1(pipeHandler pipe)
        {
            pipePointer=pipe;
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
        }

        private void button1_Click(object sender, EventArgs e)
        {
            pipePointer.writePipe(textBox1.Text);
            textBox2.Text = pipePointer.readPipe();
        }

        private void CloseForm(object sender, EventArgs e)
        {
            pipePointer.closeConnection();
       }
    }



Клиент C++ :

#define chrSize 16

int main()
{
	TCHAR chr[chrSize];
	DWORD bytesRead;

	HANDLE pipeHandler;
	LPTSTR pipeName = TEXT("\\\\.\\pipe\\myNamedPipe1");

	pipeHandler = CreateFile(
		pipeName,   // pipe name 
		GENERIC_READ |  // read and write access 
		GENERIC_WRITE,
		0,              // no sharing 
		NULL,           // default security attributes
		OPEN_EXISTING,  // opens existing pipe 
		0,              // default attributes 
		NULL);          // no template file 

	ReadFile(
		pipeHandler,    // pipe handle 
		chr,    // buffer to receive reply 
		chrSize * sizeof(TCHAR),  // size of buffer 
		&bytesRead,  // number of bytes read 
		NULL);    // not overlapped 

	cout << "\n"<<chr;

	LPTSTR pipeMessage = TEXT("message receive");
	DWORD bytesToWrite= (lstrlen(pipeMessage) + 1) * sizeof(TCHAR);
	DWORD cbWritten;

	WriteFile(
		pipeHandler,                  // pipe handle 
		pipeMessage,             // message 
		bytesToWrite,              // message length 
		&cbWritten,             // bytes written 
		NULL);                  // not overlapped 
	
	return 0;

}


Запуск программы просто дает это исключение в C#

************** Текст Исключения ************** Система.InvalidOperationException: труба еще не подключена. .... .... ....

Что я уже пробовал:

я просмотрел несколько примеров, но не могу понять, почему он не может подключиться

[no name]

Какие примеры вы рассматривали? Вы использовали отладчик? Зачем комментировать WaitForConnection ()? В MSDN есть примеры, которые действительно работают - почему бы не использовать их?

Jochen Arndt

В дополнение к вышесказанному:

Проверьте возвращаемые значения функций ввода-вывода в вашей программе C++. При неудачах вызовите GetLastError (), чтобы получить код ошибки и сообщить о ней.

Функция ReadFile () будет блокировать синхронный ввод-вывод (не перекрывающийся, как используется вашим кодом) до тех пор, пока не завершится операция записи в конце канала записи (ваше приложение C#) или не возникнет ошибка. Таким образом, он не вернется, пока вы ничего не напишете в канал на стороне сервера.

1 Ответов

Рейтинг:
1

KarstenK

Сначала я вижу разницу в названии именованного канала. У C++ есть путь, но у C# его нет.
Во-вторых, C# не полностью инициализируется до запуска C++.
В-третьих: требуется некоторое WaitForConnection. Регистрация MSDN для асинхронной версии.

Взгляните на пример кода от Microsoft У них был совсем другой подход.