当缓冲区为CString时,ReadFile的怪异行为

ReadFile weird behavior when buffer is CString

本文关键字:ReadFile 缓冲区 CString      更新时间:2023-10-16

我继承了使用ReadFile Windows API方法在循环中从并行端口读取单个字节的代码。

代码传递CString实例作为缓冲区参数,传递1作为要读取的字节数,如下所示:

CString inBuffer = "";
bResult = ReadFile(hCom, inBuffer.GetBuffer(1), 1, &nBytesRead, NULL);
allData += inBuffer.GetBuffer(1);

它用这个代码工作了很长一段时间,但有时会引起奇怪的问题,例如,从机器发送的"AV01000"输入被读取为"AkVk0k1k0k0"——不知何故,在读取每个字符后都添加了一些随机字符。

我花了很长时间才弄清楚这种行为的来源,并且在将代码更改为:之后

char buffer = '';
bResult = ReadFile(hCom, &buffer, 1, &nBytesRead, NULL);
allData += buffer;

它工作完美,读取了机器发送的确切数据。

这是CString内部代码中的某种缓冲区溢出吗?如果不是的话,如何解释这种奇怪的行为?

删除地址运算符:

bResult = ReadFile(hCom, inBuffer.GetBuffer(1), 1, &nBytesRead, NULL);

另外:不要忘记对ReleaseBuffer的匹配调用。添加字符

allData += inBuffer;

应该足够了。

首先,CString根据您为项目选择的编码进行操作。如果您的项目是Unicode格式,则每个字符都存储在以两个字节表示的CString字符中(WCHAR(。如果文件和对象具有相同的编码,它将正常工作。(也可以通过分析开头的BOM字符来确定文件编码(

您传递的缓冲区大小为1。如果您仍然想使用CString对象,请通过调用GetFileSize((API传递文件长度来传递缓冲区的正确大小。

我建议你使用缓冲区分配的方法。

char* pReadbuff = new char[sizeoffile];
ReadFile(..);
CString objStr = pReadbuff;
delete pReadbuff;