2011-02-10 18 views
1

C++と.NETの間でNamed Pipesを動作させるのは本当に苦労しました。 2つのC++アプリケーション間または2つの.NETアプリケーション間で動作するNamed Pipesの作成に問題はありませんでした。C++と.NETの間で名前付きパイプを動作させる方法を教えてください。

+0

詳細はしてください。それはどこで失敗するのですか? –

+0

特定のエラーが表示されますか? –

+0

すごい、速い反応。申し訳ありませんが、質問をした直後に問題の回答を投稿しようと思っていますが(他の人を助けるために)、気が散ってしまい、回答が予想よりも長くかかりました。ご心配をありがとう。 – Solx

答えて

2

私はこのコミュニケーションに問題はありません。私はこのシナリオをいくつかのプロジェクトで使用しています。

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

パイプの作成: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;-) 

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

これは機能し、私の答えもご覧ください。問題は、.NETおよびC++ではパイプ名文字列が異なることです。 – Solx

+0

Readの最後のparamは本当に '_buffer.Length-_lenght'でなければなりません。 – Cameron

1

私はそのパイプの名前を確認するためにProcessExplorerを使用することがわかっ私は開いていた。 私はC++と.NETの両方で全く同じ名前を使用しましたが、ProcessExplorerはそれらが異なっていたことを示しました。

私はこれらの名前を使用して終了:.NETで : "\\ \パイプ\のXXXDebug。"

C++で: "\\ \パイプ\ PIPE \ XXXDebug"

何私はこれらの両方のためにProcessExplorerにして見た: \デバイス\名前付きパイプの\パイプ\のXXXDebug

もう一つは、私は経由.NETでのパイプをオープンしました:

NamedPipeServerStreamパイプ=という名前の新しいですPipeServerStream(_pipeName、PipeDirection.InOut、1、PipeTransmissionMode.Byte);

そして、私はC++経由でパイプをオープンしました:

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

今回は、すべてが...余分なパイププレフィックスでした...本当にM $ ?!真剣に! – Alexandru

関連する問題