我真的很难让命名管道在c ++和.NET之间工作。 创建在2个c ++应用程序之间或2个.NET应用程序之间工作的命名管道时没有任何问题。
答案 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);