2010-01-14 193 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