トップページ > 過去ログ > 記事閲覧
LoadSoundMem直後にファイルオープンできない?
名前:平部 之雄 日時: 2010/09/12 23:42

「BMPやWAVファイルだとデータが読まれてしまうので… 」 ttp://homepage2.nifty.com/natupaji/DxLib/dxtec.html#M3 で紹介されている方法でwavファイルのファイル識別文字列を変更しようとして上の紹介にある方法を真似て次のソースを打ちました。 //sndファイルを読み込む int CMainSystem::RoadOfsndFile(char* file_name) { FILE *fp; int Handle=0; fp = fopen(file_name,"r+b");//←ファイルは正常にオープン fwrite("RIFF",sizeof(char),4,fp);// ←ここは成功 fclose(fp);// ファイルを閉じる Handle=::LoadSoundMem(file_name);// 曲データを改めて読みこむ fp = fopen(file_name,"r+b");//←fpにNULLが返ってくる fwrite(" ",sizeof(char),4,fp);//←ここで強制終了 fclose(fp);// ファイルを閉じる return Handle; } 実行したらこの関数のところで強制終了してしまいました。 デバッガでどの行がおかしいか確認してみるとLoadSoundMemの後のファイルオープンが失敗していることがわかりました。  だけれどもファイルオープンに失敗するのかがわかりません。なぜなのでしょうか・・・ 試しに 「LoadSoundMemの直後にファイルオープンしてファイル識別文字列を変更」 ではなく 「アプリ終了時(デストラクタ)にファイルオープンしてファイル識別文字列を変更」 という風に変えると問題なくいきました。 もしかしたら  「LoadSoundMemの直後にファイルオープンしようとしているから?」 かと思い、質問させていただきました。 環境は OS:WindowsXPSP3 開発環境:VC2008 DxLib:バージョンは3.03 です

Page: 1 |

Re: LoadSoundMem直後にファイルオープンできない? ( No.1 )
名前:いっち 日時:2010/09/13 00:47

> だけれどもファイルオープンに失敗するのかがわかりません。なぜなのでしょうか・・・ > 「LoadSoundMemの直後にファイルオープンしようとしているから?」 その通りだと思います。 実際に検証したわけではないのであてずっぽうなのですが・・・。 LoadSoundMem 関数では、設定や読み込むファイルの種類によっては逐次ファイルから読み出すストリーム形式のハンドルが作られます。 そのため、LoadSoundMem 関数が実行されると、対象となるファイルにはロックがかけられるのかもしれません。 (デフォルトの設定や小さなwavファイルなどではメモリに一括して読み込まれるはずですが) ですので、ハンドルを DeleteSoundMem 関数で解放した後であれば、問題なくファイルをオープンできるのではないかと思います。
なるほど・・・ ( No.2 )
名前:平部 之雄 日時:2010/09/13 22:41

>いっち さん 回答ありがとうございます。 LoadSoundMemだとストリーム形式でファイルから読まれていくんですね。それならば直後にファイルオープンの処理はまずいですね。納得しました! )DeleteSoundMem 関数で解放した後 の方法でやってみようと思います。

Page: 1 |