MessageBox从TCHAR缓冲区打印额外的unicode字符

时间:2017-05-05 18:29:30

标签: c++ winapi unicode

所以我正试图让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);

如果有人能救我溺水,我会非常感激。

2 个答案:

答案 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