2011-06-30 22 views
2

ダミーファイルシステムをディスクに取り込むプログラムを作成しています。WriteFile returned error 1784

現在、私はWriteFileを使用して可変サイズのファイルを作成しています。

 WriteFile(hFile, FileData, i * 1024, &dwWrote, NULL); 
     err = GetLastError(); 

ERRは

供給されたユーザバッファに変換#1784を返し、要求された操作のために有効ではありません。 ERROR_INVALID_USER_BUFFER

したがって、最初の24ファイルの場合、書き込み操作が機能します。ファイル#25がオンの場合、書き込み操作は失敗します。 ファイルはまだ作成されていますが、WriteFile関数はファイルを生成しません。

どのように過去の取得方法に関するアイデアERROR_INVALID_USER_BUFFER

エラーが発生した場合は、プログラムをクラッシュさせることに限定されていますが、私が経験している問題とどのように関係しているのか分かりません。

EDIT:

FileData = (char *) malloc(sizeof(char) * (size_t)k * 1024); 
memset(FileData, 245, sizeof(char) * (size_t)k * 1024); 

FILEDATAが最大の大きさに設定され、割り当てられているバッファ予想します。 iは、最大サイズ(k)までインクリメントするまで反復するループ変数です。

+0

べきか? –

+0

また、クラッシュは通常、UB(通常は無効なメモリにアクセスしようとしている)の結果であることに注意してください。しかし、クラッシュはUBの結果とは必ずしも一致しません。何が起こるかは予測できません。ですから、起こっていないクラッシュが予想される場合は、あまり読みすぎないようにしてください。 –

+0

未処理の非同期I/O要求が多すぎると、WriteFile関数がERROR_INVALID_USER_BUFFERまたはERROR_NOT_ENOUGH_MEMORYで失敗することがあります。 –

答えて

4

私の推測では、FileDataは、それからi * 1024バイトを書き込むのに十分な大きさではないと思います。 iはあなたのファイルリストのループ制御変数ですか?その場合は、ファイルをループする際に書き込みバッファーFileDataを1Kずつ増やす必要があります。

これは珍しい構成です。ここで論理が正しいと確信していますか?回答をより正確にするために、コードを投稿してください(具体的には、すべてFileDatai)。

ここでは必ずGetLastErrorをチェックするべきではないことに注意してください。意味のあるものに頼る前に、WriteFileの戻りコードをチェックする必要があります。さもなければ、あなたのコードの無関係な部分からエラーをピックアップすることができます。

+0

オリジナルのポストをさらに詳細に更新しました – jscott

+0

さらに、dwWroteが0の場合、WriteFileは0を返します。 – jscott

+0

ランダムなコードスニペットに基づいて正確なアドバイスを提供することは本当に不可能です。エラーを再現し、すべてを投稿するために最小限必要なものを入手してください。 –

2

私はError = 1784を持っていました。レコードのサイズを指定せずにファイルを開いてファイルを読み込みブロックしたからです。

Reset(FileHandle); 

どのように我々はそれらのパラメータが持っているものの種類を知っているされている、とあなたが以前に彼らと一緒にやった

Reset(FileHandle, 1);