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

时间:2011-06-30 08:55:04

标签: c++ readfile c-strings

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

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

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

它使用了这段代码已经很长时间了,但是有时会引起奇怪的问题,例如从机器发送的输入,因为“AV01000”被读作“AkVk0k1k0k0k0” - 不知何故,每个字符读取后都会添加一些随机字符。

我花了很长时间来确定这种行为的来源,并在将代码更改为:

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

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

这是CString内部代码中的某种缓冲区溢出吗?如果没有,可以解释这种奇怪的行为?

2 个答案:

答案 0 :(得分:1)

删除地址运算符:

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

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

allData += inBuffer;

应该足够了。

答案 1 :(得分:0)

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

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

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

喜欢

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