Windows2000、VC++6.0、MFC、ダイアログベースでアプリケーションを作っているのですが、
ファイルを開くところでうまくいかなくて困っています。
メディアプレーヤーなどで再生中のものを開き内容を読み込もうとするとエラーで終了してしま
す。
デバッグで見たところCFileのOpenはできているのですが、Readでエラーが発生しているようで
す。
やはり他のプログラムで使用中のファイルは編集などをもちろんできないと思いますが、
内容の読み出しも不可なのでしょうか?
Pieさんへ
>デバッグで見たところCFileのOpenはできているのですが、Readでエラーが発生して
>いるようです。
> ・・・・
>内容の読み出しも不可なのでしょうか?
先に開いているアプリなどが排他制御の処理をしていたら、Read()は無理だと思いま
すが・・・
排他オープンされていれば開けないだろうけど、
>デバッグで見たところCFileのOpenはできているのですが
本当にOpenできているの?
部分ロックするAPIもありますから、
Open だけできる場合もあるでしょう。
エラーメッセージ(またはエラー番号)は何でしょうか?
メディアプレーヤー等で再生中のもの、つまり継続的にファイルを読み込んでいる
アプリケーションの場合、読み込みが出来ない可能性が高いです。
ひょっとして、停止すると読込めるなんてことはないですか?
ファイルのI/Oに関するAPIやクラスを調べてみればわかりますけれど、
排他にも色々種類があって読み込みも含めて全てのアクセスを禁止する事も可能だったと
思います。
ですから、そのファイルを開いているアプリケーション次第という事になるでしょう。
どういう排他で開いていると言うような話はアプリの説明で一々書かれていないでしょう
から、
開けなかったらそのファイルを開いているアプリを終了させるとかファイルを閉じてもらう
しか方法はないと思います。
皆様ご回答ありがとうございました。
>停止すると読込めるなんてことはないですか?
選択されている状態(再生ボタンを押してすぐ再生される状態)にあるファイルは停止してもエ
ラーが起こります。
次に再生されるものはエラーせずに読み込めました。
>エラーメッセージ(またはエラー番号)は何でしょうか?
申し訳ありません、エラー番号等はわかりません。知識不足でして・・・。
一応デバック中ステップインしていったところ、
UINT CFile::Read(void* lpBuf, UINT nCount)
関数内の
ASSERT(m_hFile != (UINT)hFileNull);
の部分でエラーが起こるようです、この辺の内容は全くと言っていいほど理解していないので
どういったものなのかはわかりませんが・・・。
>開けなかったらそのファイルを開いているアプリを終了させるとかファイルを閉じてもらう
>しか方法はないと思います。
↑と言うことでしたら仕方ないので諦めます。
連続質問になってしまうのですが、今の現状のようなエラーが起こるときの
エラー処理の方法は一体どのように記述していったらいいのでしょうか?
よろしければこの点もご教授願えればと思います。
> ASSERT(m_hFile != (UINT)hFileNull);
ハンドラが取れてませんので、Open の時点で失敗してそうですね。
> エラー処理の方法は一体どのように記述していったらいいのでしょうか?
一般的には、API等を呼び出したら、その戻り値を正しく確認してエラーか否かを判断します。
Open の戻り値も正しく確認してみてください。失敗してませんか。
CFile file;
BOOL result = file.Open(…);
if(result == FALSE){
ここは失敗
}
CFileなら try~catch で例外を捕まえておくべきですね。
Banさん返信ありがとうございます
>CFile file;
>BOOL result = file.Open(…);
>if(result == FALSE){
> ここは失敗
>}
試してみましたところOpenで失敗していたようでした・・・。
やはり使用中だと開けないものかと思い、同じ状況でBV6.0の方でもやってみたのですが、
VBでは開けて内容の読み込みもできました。
言語の違いで読めたり読めなかったりするものなのでしょうか?
>BOOL result = file.Open(…);
「…」の内容はどうなっていますか。
>BOOL result = file.Open(…);
>「…」の内容はどうなっていますか。
CFile file;
file.Open(FileName,CFile::modeRead | CFile::typeBinary);
にしています。
MSDNライブラリーより
>virtual BOOL Open( LPCTSTR lpszFileName, UINT nOpenFlags,
>CFileException* pError = NULL );
> pError に NULL を渡したときは、Open は FALSE を返し、
> CFileException はスローし>ません。既存の CFileException への
> ポインタを渡したときは、Open でエラーが発生>すると、
> 関数がエラーを説明する情報を補います。どちらにしても、
> Open が例外をスローすることはありません
CFileException* pError を付けて、
Buleさんの意見どおり、
>CFileなら try~catch で例外を捕まえておくべきですね。
を加えましょう。
使い方は、「MSDNライブラリー」をよくみて下さい。
みなさま返信ありがとうございました。
エラー処理をするってことで解決にチェック入れさせてもらいます。
また何かありましたしたらよろしくお願いします。
> VBでは開けて内容の読み込みもできました。
> 言語の違いで読めたり読めなかったりするものなのでしょうか?
CFile は何も指定しない場合、排他モード(他者が開いているファイルは開けない)で
オープンするようですね。
共有指定を付けましょう。
CFile file;
file.Open(FileName,CFile::modeRead | CFile::typeBinary |
CFile::shareDenyNone);