Fopenが存在するファイルを開くことに失敗するのはなぜですか?
質問
Visual Studio 6(はい、古いことを知っている)を使用してWindows XPを使用しています。C++ DLLの構築/維持です。 Fopenが既存のファイルを開くことに失敗したことで問題が発生しましたが、常にNULLを返します。
私はもう試した:
- 両方をゼロに設定してから再度チェックすることにより、errnoと_doserrnoをチェックすると、両方ともゼロのままであるため、getLasterRor()がエラーを報告しません。 FOpenは、C標準に応じてエラーに遭遇したときにErrnoを設定する必要がないことを知っています。
- ファイルパスのハードコードは相対的ではありません。
- 同じ結果の別の開発者マシンを試しました。
本当に奇妙なことは、createfile作品であり、ファイルはreadfileで読むことができます。これはリリースビルドで機能すると考えていますが、アプリケーションの他の領域では非常に奇妙な動作も見ており、これが関連しているかどうかはわかりません。
コードは以下にありますが、私には非常に標準的に見える奇妙なものは何も見られません。ソースファイルは半年未満で変更されていません。
HRESULT CDataHandler::LoadFile( CStdString szFilePath )
{
//Code
FILE* pFile;
if ( NULL == ( pFile = fopen( szFilePath.c_str(), "rb") ) )
{
return S_FALSE;
}
//More code
}
正しい解決策はありません
他のヒント
答え:
私は原因を見つけました、あまりにも多くのオープンファイルハンドルがアプリケーションの最近の更新によって原因です。これらはコードが変更されない場合、このバグはしばらく存在しています。 fopen関数に踏み込んで、_getStreamという関数に行きました。これにより、使用されていないストリームを見つけようとします。関数は、512のストリームのテーブルを検索します。私は使用しました 扱う Sysinternalsのツールは、使用済みハンドルの数を確認します。
あなたの関数にはhresultリターンタイプ(0が良い)がありますが、ブール(0が悪い場合)を返します。それは正しいことではありません...
VC6の合理的なバージョンがあると仮定すると、CRTのソースコードがあり、FOPENコールに足を踏み入れることができ、CRTが作成するCreateFileコールまでずっと下がっていきます。 (それがかなり長い道のりになるために準備してください!)
FOPENラインにブレークポイントを置き、デバッガーでトリガー、入力」err、hr「Watch」ウィンドウで、行を実行して、問題が何であるかを確認してください。おそらくアクセス権限です。
すでに512個のオープンファイルを持っています。
VCアプリケーションでMax 512を開くファイルのみを保持できます。不要なファイルを使用して閉じることをお勧めします fclose
.