2011-06-30 45 views
-5

我使用ReadFile Windows API方法從循環中的並行端口讀取單個字節,從而繼承了代碼。緩衝區爲CString時的ReadFile奇怪行爲

代碼通過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的內部代碼中的某種緩衝區溢出?如果不是,可能會解釋這種奇怪的行爲?

回答

1

刪除地址操作:

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

另外:不要忘了相應地調用ReleaseBuffer。並添加該字符

allData += inBuffer; 

應該是足夠的。

+0

我不好,錯字。它不在原始代碼中,現在在一些備份中檢查確定。對不起,誤導,現在編輯。 –

+0

'ReleaseBuffer'可能是事情,它從來沒有在原始代碼中調用 - 你認爲它可能會導致像我在我的問題中描述的行爲? –

+0

@ShadowWizard:我知道當我忘記了ReleaseBuffer的調用時,我曾經有過錯誤,但我不記得發生了什麼。 –

0

首先,CString根據您爲項目選擇的編碼行事。如果您的項目是Unicode格式,則每個字符都存儲在以兩個字節(WCHAR)表示的CString字符中。如果文件和對象具有相同的編碼,它將正常工作。 (也可以通過分析BOM字符來確定文件編碼)

您傳遞的緩衝區大小爲1.如果您仍想使用CString對象,請通過傳遞適當的緩衝區大小文件的長度通過調用GetFileSize()API。

我建議你使用緩衝區分配方法。

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

沒有文件,我正在從機器的並行端口讀取。 –

+0

任何有效的句柄都被視爲一個文件。它可以是一個磁盤文件,設備或任何東西。如果您正在從文件中讀取數據,最好使用固定大小的緩衝區,但仍然不建議使用CString請參閱http://msdn.microsoft.com/en-us/library/aa450604.aspx – sarat

+0

是的,我知道,但那是我繼承的代碼。 –