如何在c ++和.NET之间使命名管道工作?

时间:2011-02-10 18:33:41

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

我真的很难让命名管道在c ++和.NET之间工作。 创建在2个c ++应用程序之间或2个.NET应用程序之间工作的命名管道时没有任何问题。

2 个答案:

答案 0 :(得分:2)

我没有这个沟通的问题,我在某个项目中使用这个场景。

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);

答案 1 :(得分:1)

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

我最终使用了这些名字: 在.NET中: “\\。\管\ XXXDebug”

在c ++中: “\\。\管\管\ XXXDebug”

我在ProcessExplorer中看到的两个是: \设备\ NamedPipe \管\ 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);