2011-06-29 14 views
0

私は非常に奇妙な問題があります。私はUSB経由でPCに接続されたデバイスからデータを読み込むためにReadFile()を使用しています。読み込まれるデータが64バイトのチャンクで受信されると、常にReadFile()が読み込まれるために64バイトで呼び出されます。しかし、64バイト未満のフレームを読み込まなければならないときに、クラッシュが発生することがあります。C++のReadFileクラッシュ

Iは、書かれたコードの例を与えなければならない:

//Memory allocation done to read 100 bytes from device - This value is known in prior and hence memory is allocated exactly 
new(100bytes); 
// First read of 64 bytes 
ReadFile(64) 
// Second read of 64 bytes 
ReadFile(64) 

- デバイスから送信される>ここで、データは、私は64のリードを言う場合でも、従って= 36のみが100から64でありますデータが36バイトを超えるシナリオはありません。したがって、このコードはうまくいくはずです(ただし、私はそれが間違っていることを知っているより少ないメモリを割り当て、メモリ割り当てよりも大きいサイズのReadFileを呼び出す)。

質問:(私たちは、私は読むために必要なデータの正確なサイズが何であるかを知っているが)でしたのReadFile()クラッシュデータを読み込む場合は、メモリの割り当てが行われるよりも多くのバイトを

を行われているPS:そのような種類の理由実装されたコードの設計には小さな欠陥がありました。

+0

非同期モードで開いていますか? ReadFileは、主にファイル(またはデバイス)からデータを同期的に(非同期モードもサポートして)読み込むために使用されます。非同期モードで作業している場合は、ReadFilExを使用することをお勧めします – sarat

答えて

0

まあ、私は単にReadFileの呼び出しがプログラムをクラッシュさせるのではないかと疑います。 WindowsののReadFile関数を仮定すると、私はdocumentationを引用してみましょう:

をのReadFile関数は、ファイルの末尾を越えて読み取ろうとした場合、関数はゼロを返し、GetLastError関数はERROR_HANDLE_EOFを返します。

このエラーを処理しているか、まったく確認せずに続行していますか?

1

完全に可能です。 APIに嘘をつけてはいけません。彼らはどのように動作しているのか、変更できるのかはわかりません。それがポイントの一部です。どのようにクラッシュするのかは言わないが、アクセス違反かもしれない。なぜ私は確かにわからないが、私は一つの可能​​性を推測することができる。おそらく、ReadFileはあなたのものに直接ではなく中間バッファ(またはバッファ)を読み込みます(これを行う理由はいくつかあります)。可能であれば、dwordサイズのコピーをバッファに戻します。それでも正しいバイト数が返されますが、バッファに "余分な"ものがコピーされる可能性があります。 ReadFileにあなたのバッファの正しいサイズを伝えている限り、これは問題ありません。

真実を伝えてください。