所以我正试图让NamedPipe IPC项目正常运行,以便我的C#GUI可以与我的C ++代码进行通信,我应该提到我在C ++上有点深入了解此刻,虽然,在大多数情况下,我有它的工作。
我不能为我的生活弄清楚如何翻译?'由C ++监听器收到的chReply缓冲区到一个简单的字符串和MessageBox它,我总是得到额外的unicode字符。我添加了认为最重要的部分。
C#Pipe Write
byte[] bReply = Encoding.Unicode.GetBytes("#TEST 123 456");
uint cbBytesWritten;
uint cbReplyBytes = (uint)bReply.Length;
bool bResult = PipeNative.WriteFile(hPipe, bReply, cbReplyBytes, out cbBytesWritten, IntPtr.Zero);
C ++ Pipe Read
// Project's Character Set: Unicode
// BUFFER_SIZE = 1024
TCHAR chRequest[BUFFER_SIZE];
DWORD cbBytesWritten, cbRequestBytes;
TCHAR chReply[BUFFER_SIZE];
DWORD cbBytesRead, cbReplyBytes;
cbReplyBytes = sizeof(TCHAR) * BUFFER_SIZE;
do
{
bResult = ReadFile(hPipe, chReply, cbReplyBytes, &cbBytesRead, NULL);
}
while(!bResult);
MessageBox(NULL, chReply, _T("GUI Request"), MB_OK);
如果有人能救我溺水,我会非常感激。
答案 0 :(得分:1)
你有一些问题。第一个是您阅读和丢弃数据。第二个是你不注意缓冲区位置的结束。
// Project's Character Set: Unicode
// BUFFER_SIZE = 1024
TCHAR chRequest[BUFFER_SIZE];
DWORD cbBytesWritten, cbRequestBytes;
std::basic_string<TCHAR> result;
do {
TCHAR chReply[BUFFER_SIZE];
DWORD cbBytesRead;
bResult = ReadFile(hPipe, chReply, sizeof(chReply), &cbBytesRead, NULL);
if (bResult)
result.insert( result.end(), chReply, chReply+cbBytesRead/2 );
}
while(!bResult);
MessageBox(NULL, result.data(), _T("GUI Request"), MB_OK);
这里我们将字节复制到basic_string<TCHAR>
。它会自动处理空终止等,并允许传递长消息。
我们一次只能读取1024个字符。
答案 1 :(得分:0)
VTT是对的。每次调用chReply
后,您需要使用零初始化ReadFile
。