【问题标题】:"Pipe is broken" C# .NET pipe with C++ backend (WINDOWS)“管道已损坏”带有 C++ 后端(WINDOWS)的 C# .NET 管道
【发布时间】:2018-03-27 12:13:57
【问题描述】:

所以我目前正在用管道做一些有趣的工作。我有一个 C++ 可注入 dll,我将其注入到一个进程中以获取有关信息并报告回我的 C# GUI。我正在使用管道在后端和前端之间进行通信。这很好用,但是当我尝试与 C++ 注射剂通信时,我收到“管道已损坏”。错误。

在我的 c++ dll 中,我有以下内容:

HANDLE Pipe = CreateNamedPipe("\\\\.\\pipe\\TestPipe",
PIPE_ACCESS_DUPLEX,
PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT,
PIPE_UNLIMITED_INSTANCES,
999999,
999999,
NMPWAIT_USE_DEFAULT_WAIT,
NULL);

void PipeThread() 
{
    int numbuff;
    DWORD dwRead;

    while (Pipe != INVALID_HANDLE_VALUE)
    {
        if (ConnectNamedPipe(Pipe, NULL) != FALSE)
        {
            if (ReadFile(Pipe, (LPVOID)numbuff, sizeof(int), &dwRead, NULL) != FALSE)
            {
                std::stringstream o;
                o << numbuff << "\r\n";
                Output(o.str());
                char buff[numbuff];
                while (ReadFile(Pipe, buff, numbuff, &dwRead, NULL) != FALSE)
                {
                    Output(std::string(buff)+"\r\n");
                }
            }
        }
        DisconnectNamedPipe(Pipe); 
    }
}

^ 我已经确认线程正在运行

在我的 C# GUI 中,我有这样的东西:

private void button1_Click(object sender, EventArgs e)
    {
        if (!connected)
            return;
        using (var pipe = new NamedPipeClientStream(".", "TestPipe", PipeDirection.Out))
        {
            pipe.Connect();
            byte[] outBuffer = Encoding.ASCII.GetBytes(TextBox.Text);
            byte[] strSize = BitConverter.GetBytes(outBuffer.Length);
            pipe.Write(strSize, 0, strSize.Length);
            pipe.Write(outBuffer, 0, outBuffer.Length);
            pipe.Flush();
        }
    }

但是,在运行时,我从 .NET 收到“管道损坏”错误。为什么会这样?

【问题讨论】:

    标签: c# c++ .net multithreading named-pipes


    【解决方案1】:

    您是否尝试过使用 StreamWriter?

    private void button1_Click(object sender, EventArgs e) { if (!connected) return; using (var pipe = new NamedPipeClientStream(".", "TestPipe", PipeDirection.Out)) { using (var stream = new StreamWriter(pipe)) { pipe.Connect(); stream.Write(TextBox.Text); pipe.Flush(); } } }

    【讨论】:

    • 我开始这样做,但是当我的最终产品无序读取它们时遇到了问题。
    • 也许刷新它?流。冲洗();流。关闭();还是将 AutoFlush 设为 true?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-28
    • 2011-03-19
    • 1970-01-01
    • 2012-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多