0

私は VC++ と C# の両方を使用しているプロジェクトを行っています。VC++ はハードウェア インターフェイス用であり (他の方法はありません。VC++ のみを使用する必要があります)、アプリケーション側では C# (マイクロ ソフト ビジュアル スタジオ 2008) を使用しています。

両方のプログラムが互いに通信するために、名前付きパイプを使用しています (これも必須です)。

C# と VC++ の間では通信できますが、VC++ から C# への通信はできません。

私はC#で使用しているコードを以下に示しました。

using (NamedPipeServerStream pipeStream = new NamedPipeServerStream("mytestpipe"))
{
pipeStream.WaitForConnection();
Console.WriteLine("[Server] Pipe connection established");

using (StreamReader sr = new StreamReader(pipeStream))
 {
   while ((temp = sr.ReadLine()) != null)                    
   {
      MessageBox.Show(temp));    
   }
 }
}

ここでの問題は、sr.ReadLine(). まったく終了していません。null が見つかったら停止する必要がありますが、VC++ で指定された null 値は C# では NULL と見なされません。

ではどうすればいいのでしょうか?

4

2 に答える 2

1

C++ の NULL 定数は、実際には単なるゼロです。タイプ「int」の単純なゼロであり、特別なことは何もありません。したがって、パイプに NULL を書き込むと、ゼロを送信するだけです。それだけです。そして、C# 側は、読み取っている文字列の一部としてそのゼロを忠実に読み取ります。

ReadLine() は、次の 2 つの場合に終了します。

1)「改行」シーケンス (つまり、0x0D 0x0A) に遭遇した後。

2)基になるストリームが終了したとき (この場合、パイプが閉じられたとき)

2 番目のケースでは、ストリームが閉じられる前に読み取る機会があったものをすべて返し、それ以降の ReadLine() の呼び出しは null を返します。

したがって、ReadLine() が null を返すようにするには、VC++ 側からパイプを閉じる必要があります。

ただし、これはあなたがやろうとしていることではないと思います。したがって、私のアドバイスは、最初に通信に使用するプロトコルを開発し、慎重に指定してから、実際に受信側と送信側をコーディングすることです。

于 2009-11-07T18:01:15.403 に答える
0

ReadLine は、ファイルの終わりに到達したときにのみ NULL を返します。データを送信した後、クライアント側でパイプを閉じますか?

于 2009-11-07T18:00:32.567 に答える