2010-01-14 114 views
1

我有一个游戏的API,它调用C++ dll中的方法,您可以通过修改DLL并调用某些方法来编写游戏的机器人。这很好,除非我不是C++的忠实粉丝,所以我决定使用命名管道,这样我就可以将管道中的游戏事件发送到客户端程序,并发回命令 - 然后C++端只是一个简单的框架用于在命名管道上发送监听。进程间通信

我对事物的C#侧的一些方法是这样的:

private string Read() 
{ 
    byte[] buffer = new byte[4096]; 

    int bytesRead = pipeStream.Read(buffer, 0, (int)4096); 

    ASCIIEncoding encoder = new ASCIIEncoding(); 
    return encoder.GetString(buffer, 0, bytesRead); 
} 

private void Write(string message) 
{ 
    ASCIIEncoding encoder = new ASCIIEncoding(); 
    byte[] sendBuffer = encoder.GetBytes(message); 
    pipeStream.Write(sendBuffer, 0, sendBuffer.Length); 
    pipeStream.Flush(); 
} 

什么是对事物的C++方面的等效方法?

回答

1

创建管道并具有管道手柄后,可以使用ReadFileWriteFile API进行读取和写入:有关代码示例,请参阅MSDN中的Named Pipe Client


不过,我在我的损失究竟如何使用它们。

上面引用的“命名管道客户端”部分给出了一个如何使用它们的例子。

例如,什么是

该类型的所有参数在MSDN中定义的所有参数的类型:看到ReadFileWriteFile

如何从一个转换字节的缓冲区,我大概从ReadFile方法接收到一个字符串,反之亦然?

您使用ASCIIEncoding发送字符串,因此您将收到一串非Unicode字符。

您可以转换为字符串,使用的std :: string构造函数需要一个指向字符缓冲区加上指定多少字符在缓冲区中sencond参数过载:

//chBuf and cbRead are as defined in the 
//MSDN "Named Pipe Client" example code fragment 
std::string received((const char*)chBuf, cbRead); 
+0

谢谢,我明白,在我的例子中,ReadFile和WriteFile等同于pipestrea.Write/Read。但是,我很害怕如何使用它们。 例如,所有参数的类型是什么,如何从缓冲区中将字节缓冲区转换为字符串,反之亦然? – Martin 2010-01-14 10:54:53

+0

我编辑了我的答案,以回答评论中的其他问题。 – ChrisW 2010-01-14 11:31:27