初めまして。
きゃんと申します。
開発環境 : MFC, VC++
CFileDialogで「ファイルを開く」ダイアログを作成しているのですが、下記手順で処理
を実行すると、ボリュームロックができなくなります。
1.ダイアログでファイルを選択し、「開く」ボタンを押下する。
2.選択したファイルのデバイスをオープンする。
3.選択したファイルのデバイスをロックする。
(DeviceIoControlのFSCTL_UNLOCK_VOLUMEを発行)
ここで、ロックに失敗します。(GetLastError()→5)
「ファイルを開く」ダイアログを使用しない場合はロックに成功しているので、
ダイアログからファイルにアクセスした後に、何か問題があるのではと思うのですが、
調べても後処理が必要とは思えず、どうしていいか困っています。
API(GetOpenFileName)を使っても結果は同じでした。
CFileDialogを使用すると、選択したファイルにアクセスし続けてしまうのでしょうか?
何かご存知の方、いらっしゃいましたら教えていただきたく。
よろしくお願いします。
カレントディレクトリがそこ=開いたディレクトリに移るためだと思われます。
tetrapodさん、ありがとうございます。
> カレントディレクトリがそこ=開いたディレクトリに移るためだと思われます。
その通りでした。
今回は、
・ダイアログで開くファイルは、確実に起動ディレクトリがあるドライブとは異なる。
・ボリュームロックしたいのは開いたファイルが存在するドライブのみ。
という前提があるため、
ファイル参照前のカレントディレクトリ(=起動ディレクトリ)を取得しておき、
ファイル参照後にカレントディレクトリを元に戻すことで対応できました。
本当にありがとうございました。
ファイルアクセスをフルパスで行うのであれば、
OFN_NOCHANGEDIRを指定してファイルダイアログを開くだけでも良さそうな気がします。
PATIOさん、回答ありがとうございます。
> ファイルアクセスをフルパスで行うのであれば、
> OFN_NOCHANGEDIRを指定してファイルダイアログを開くだけでも良さそうな気がしま
す。
上記の方法でも大丈夫でした。
CFileDialogを使用すると、ファイル参照時にはカレントディレクトリが移動するものと
思い込んでいました。
カレントディレクトリを戻すよりスマートなので、OFN_NOCHANGEDIRを使うことにしま
す。
ありがとうございました。