-5

我已经使用ReadFileWindows 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吗?如果不是,什么可以解释这种奇怪的行为?

4

2 回答 2

1

删除地址运算符:

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

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

allData += inBuffer;

应该足够了。

于 2011-06-30T09:11:10.017 回答
0

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

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

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

喜欢

char* pReadbuff = new char[sizeoffile];
ReadFile(..);
CString objStr = pReadbuff;
delete pReadbuff;
于 2011-06-30T10:20:10.377 回答