2009-11-07 60 views
0

我在做一个使用VC++和C#的项目。 VC++是为硬件接口(没有其他去,我必须使用VC + +)和应用程序端我使用C#(微软软件Visual Studio 2008)。在VC++ 6.0和C#之间命名的管道visual studio 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()。根本没有终止。它应该在发现空值时停止,但C++中给出的空值不会被视为NULL。

现在该怎么办?

回答

0

ReadLine只会在到达文件末尾时返回NULL。发送数据后,您是否在客户端关闭管道?

1

C++中的NULL常量实际上只是一个零。一个简单的“int”类型的零,没什么特别的。所以,当你向管道写入NULL时,你只是发送一个零,就这样。并且C#端忠诚地读取零作为它正在阅读的字符串的一部分。

的ReadLine()终止于两种情况:

1)遇到一个 “新行” 序列之后(即,0X0D的0x0A)。

2)当底层流已经结束(对于此情况下,意味着,当管道被关闭)

在第二种情况下,它返回不管它有机会读取流关闭之前,并且对ReadLine()的任何后续调用都将返回null。

因此,为了使ReadLine()返回null,你必须关闭VC++端的管道。

但是,我想这不是你想要做的。因此,我的建议是首先开发并仔细地指定要用于通信的协议,然后才能实际编码接收和发送端。