Межпроцессного взаимодействия - PullRequest
1 голос
/ 14 января 2010

У меня есть API для игры, который вызывает методы в DLL C ++, вы можете написать ботов для игры, изменив 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 Ответ

1 голос
/ 14 января 2010

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


Однако я точно не знаю, как их использовать.

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

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

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

как мне преобразовать из буфера байтов, которые я предположительно получаю из метода 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);
...