【问题标题】:How do I make named pipes work between c++ and .NET?如何使命名管道在 C++ 和 .NET 之间工作?
【发布时间】:2011-06-25 01:45:44
【问题描述】:

让命名管道在 c++ 和 .NET 之间工作时遇到了非常艰难的时期。 创建在 2 个 c++ 应用程序或 2 个 .NET 应用程序之间工作的命名管道没有问题。

【问题讨论】:

  • 请提供更多详细信息。哪里失败了?
  • 您是否看到特定错误?
  • 哇,反应快。抱歉伙计们,我打算在询问后立即发布问题的答案(以帮助其他人),但分心了,而且回答的时间比预期的要长。感谢您的关心。
  • 欢迎来到 Stack Overflow!从提出问题到得到正确答案之间的平均时间约为 6 分钟。

标签: .net c++ ipc pipe named-pipes


【解决方案1】:

我对这种通信没有问题,我在某些项目中使用了这种情况。

C++ 方面:

LPTSTR lpszPipename = TEXT("\\\\.\\pipe\\pipename");
CHAR chReadBuf[1024];
DWORD cbRead;
BOOL fResult;  

fResult = CallNamedPipe( 
    lpszPipename,          // pipe name 
    _Message,              // message to server 
    strlen(_Message),      // message length 
    chReadBuf,             // buffer to receive reply 
    sizeof(chReadBuf),     // size of read buffer 
    &cbRead,               // number of bytes read 
    NMPWAIT_WAIT_FOREVER); // wait;-) 

在 C# 方面:

    public string GetMessageFromPipe()
    {
        int _lenght = 0;

        /*
         * Pipe Control Block
         */
        _pipeserver.WaitForConnection();

        do
        {
            _lenght += _pipeserver.Read(_buffer, _lenght, _buffer.Length);
        }
        while (!_pipeserver.IsMessageComplete);

        _pipeserver.Disconnect();
        /*
         * End of Pipe Control Block
         */

        if (_lenght == 0)
        {
            throw new ArgumentException("Message is empty ;-(");
        }

        return Encoding.UTF8.GetString(_buffer, 0, _lenght);
    }

管道创建:

_pipeserver = new NamedPipeServerStream("pipename",
  PipeDirection.InOut, 254, PipeTransmissionMode.Message,
  PipeOptions.Asynchronous, 262144, 262144);

【讨论】:

  • 这行得通,也请看我的回答。问题是管道名称字符串在 .NET 和 c++ 中不同。
  • 最后一个要读取的参数应该是:'_buffer.Length-_lenght'
【解决方案2】:

我发现我可以使用 ProcessExplorer 查看我正在打开的管道的名称。 尽管我在 c++ 和 .NET 中使用了完全相同的名称,但 ProcessExplorer 表明它们是不同的。

我最终使用了这些名称: 在 .NET 中: "\\.\pipe\XXXDebug"

在 C++ 中: "\\.\pipe\pipe\XXXDebug"

我在 ProcessExplorer 中看到的是: \Device\NamedPipe\pipe\XXXDebug

还有一件事,我在 .NET 中通过以下方式打开了管道:

NamedPipeServerStream pipe = new NamedPipeServerStream(_pipeName, PipeDirection.InOut, 1, PipeTransmissionMode.Byte);

我在 c++ 中通过以下方式打开了管道:

    g_hPipe = CreateFile(
        _pipeName,
        GENERIC_WRITE,
        0,
        NULL,
        OPEN_EXISTING,
        FILE_ATTRIBUTE_NORMAL,
        NULL);

【讨论】:

  • 所有这一切都是...只是一个额外的管道前缀...严重M$?!严重吗?!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-24
  • 1970-01-01
  • 1970-01-01
  • 2016-04-01
相关资源
最近更新 更多