MessageBox 从 TCHAR 缓冲区打印额外的 unicode 字符
Posted
技术标签:
【中文标题】MessageBox 从 TCHAR 缓冲区打印额外的 unicode 字符【英文标题】:MessageBox printing extra unicode characters from TCHAR buffer 【发布时间】:2017-05-05 18:29:30 【问题描述】:所以我正在尝试让 NamedPipe IPC 项目正常工作,以便我的 C# GUI 可以与我的 C++ 代码进行通信,我应该提到我在 C++ 方面的深度不够片刻,虽然,在大多数情况下,我让它工作。
我这辈子都不知道如何“翻译”? C++ 侦听器接收到一个简单字符串和 MessageBox 的 chReply 缓冲区,我总是得到额外的 unicode 字符。我添加了我认为最重要的部分。
C# 管道写入
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++ 管道读取
// 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);
如果有人能救我免于溺水,我将不胜感激。
【问题讨论】:
看起来chReply
不是以空值结尾的。
难以置信,我只需要用 +"\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 个字符。
【讨论】:
我明白了,我在尝试编译“错误 C2664: '....': cannot convert argument 1 from 'wchar_t' to 'std::_String_const_iterator.back()
而不是 .end()
。虽然接近英语的同义词,但它们不在 C++ 中。 :)【参考方案2】:
VTT 是对的。每次调用 ReadFile
后,您需要用零初始化 chReply
。
【讨论】:
s/初始化/终止 @CodyGray 初始化会起作用。终止可能会更快。 @yakk 当然,初始化会起作用,但需要在每次调用ReadFile
之前完成以上是关于MessageBox 从 TCHAR 缓冲区打印额外的 unicode 字符的主要内容,如果未能解决你的问题,请参考以下文章