Как заставить именованные каналы работать между C ++ и .NET? - PullRequest
3 голосов
/ 10 февраля 2011

Мне просто было очень трудно заставить Named Pipes работать между c ++ и .NET. У меня не было проблем с созданием именованных каналов, которые работали между двумя приложениями c ++ или между двумя приложениями .NET.

Ответы [ 2 ]

2 голосов
/ 10 февраля 2011

У меня нет проблем с этим общением, я использую этот сценарий в каком-то проекте.

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 голос
/ 10 февраля 2011

Я обнаружил, что могу использовать ProcessExplorer, чтобы увидеть имена каналов, которые я открывал.Хотя я использовал одно и то же имя в c ++ и .NET, ProcessExplorer показал, что они разные.

В итоге я использовал следующие имена: В .NET: "\\. \ Pipe \ XXXDebug"

В c ++: "\\. \ Pipe \ pipe \ XXXDebug"

То, что я видел в ProcessExplorer для обоих этих типов: \ Device \ NamedPipe \ pipe \ XXXDebug

OneБолее того, я открыл канал в .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);
...