进程间通信

时间:2010-01-14 10:39:50

标签: c# .net c++ ipc

我有一个游戏的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 个答案:

答案 0 :(得分: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);