Ошибка подключения именованных каналов 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#) или не возникнет ошибка. Таким образом, он не вернется, пока вы ничего не напишете в канал на стороне сервера.