Межпроцессного взаимодействия

У меня есть API для игры, которая вызывает методы в dll C++, вы можете писать ботов для игры, модифицируя DLL и вызывая определенные методы. Это нормально, за исключением того, что я не большой поклонник 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();
}

Какими будут эквивалентные методы на стороне С++?


person Martin    schedule 14.01.2010    source источник


Ответы (1)


После создания канала и наличия дескрипторов канала вы можете читать и писать с помощью API ReadFile и WriteFile: см. Клиент именованных каналов в MSDN для примера кода.


Тем не менее, я в недоумении, как именно их использовать.

Раздел «Клиент именованных каналов», который я цитировал выше, дает пример того, как их использовать.

Например, каковы типы всех аргументов

Типы всех аргументов определены в MSDN: см. ReadFile и WriteFile

как преобразовать буфер байтов, который я предположительно получаю из метода ReadFile, в строку и наоборот?

Вы отправляете строку, используя ASCIIEncoding, поэтому вы получите строку символов, отличных от Unicode.

Вы можете преобразовать это в строку, используя перегрузку конструктора std::string, который принимает указатель на буфер символов плюс параметр sendcond, который указывает, сколько символов находится в буфере:

//chBuf and cbRead are as defined in the
//MSDN "Named Pipe Client" example code fragment
std::string received((const char*)chBuf, cbRead);
person ChrisW    schedule 14.01.2010
comment
Спасибо, я понимаю, что ReadFile и WriteFile эквивалентны pipestrea.Write/Read в моем примере. Тем не менее, я в недоумении, как именно их использовать. Например, каковы типы всех аргументов, как мне преобразовать буфер байтов, который я предположительно получаю из метода ReadFile, в строку и наоборот? - person Martin; 14.01.2010
comment
Я отредактировал свой ответ, чтобы ответить на дополнительные вопросы в вашем комментарии. - person ChrisW; 14.01.2010