現在、WriteFile
(またはCFile :: Write - しかし、内部的にWriteFileを呼び出す)という問題が発生し、Win32エラー5
ERROR_ACCESS_DENIED
が発生しています。何が原因でWriteFileがERROR_ACCESS_DENIEDを返すのですか?
(EDIT:私たちは持っているすべては、現時点でのCFile ::書き込みだったとエラーERROR_ACCESS_DENIEDとして含有するソース行を示すログファイルである私たちが行動をREPROことができないことに注意してください!)
(EDIT :ファイルがローカルドライブ上にあり、それは実際にはファイルではなくディレクトリである)
さて、WriteFiles's documentationは本当に助けにはならない、と簡単なテストアプリを使って実験すると、次の結果が得られます。
- WriteFile は、書き込み用に開かれていないファイルハンドルに対して呼び出されるとERROR_ACCESS_DENIEDを引き起こします。読み取り専用に開く)。
- ハンドルが有効でないか、またはファイルが、ファイルのすべての
- アクセス権、または書き込み保護フラグで開かれていない場合
- それはない原因ERROR_ACCESS_DENIEDますの後に変更されたファイルがプロセスによって開かれました。 (これらは、ファイルが開かれ前に、ファイルを開くと失敗するため、我々はWriteFile関数に取得することはありません変更された場合。)
- ファイルが何らかの理由でエラー
32
ERROR_SHARING_VIOLATIONで最高の結果で、別のプロセス/ハンドル(この意志によってロックされています)。ファイルが実際に読み取りフラグの代わりに、書き込みフラグで開かれた場合明らかに、このコールのための唯一の可能性が失敗する状況で私たちを残し
。しかし、私たちのコードを見ると、これは非常に起こりにくいようです。 (により、当社のトレース、
に我々は
WriteFile関数が失敗したことを確認することができ、これらは描かれていないため
は、我々はエラーがERROR_ACCESS_DENIEDであることを確認することができます、我々は、開放フラグの100.1パーセントを確認することはできません。)
WriteFile(CFile :: Write)がERROR_ACCESS_DENIEDを引き起こす他の既知の状況はありますか?
注:さらに、この質問の内容を明確にする:
- ファイルはので、それがディレクトリであるか、私が行っ
- すべてのテストをsomesuchすることはできません、開いていたその中を示しますファイルは開いていますので、削除することはできませんので、ファイルはWriteFileの呼び出しでそこに残っている必要があります
- ファイルはローカルドライブにあり、ネットワークドライブにはありません。
私たちは、Windows XPのSP3上で実行しているし、あなたがそれをデバッグすることができ、あなたが必要がある場合はアプリがVisual Studioの2005
なぜあなたはオープニングフラグをトレースすることはできませんか?コードを編集したくない場合は、プロセスモニタを使用してコードを検査するだけです。 –
もちろん、トレースを追加できます。これは顧客のサイトで一度だけ発生します。そこにデバッガを追加する方法はありません。 –
ファイルシステムのフィルタドライバは、これを引き起こす可能性があります。もっとも明白な例は、ウイルス対策スキャナです(ただし、暗号化などの他にもあります)。 – Luke