指定したファイルを排他制御するが,自アプリからはアクセスを行えるような
機能を実現したいと思っています.
具体的な機能と致しましては,
・INIファイルが暗号化してあるとする.
・アプリ起動時に INIファイルを復号する.その際,INIファイルを排他制御し,
ユーザに復号した内容を知られないようにする.
・GetProfileString() などを用いて,INIファイルにアクセスする.
・アプリ終了時に,再度INIファイルを暗号化し,排他制御を解除する.
という感じです.
::CreateFile() の dwShareMode に 0 を指定することで,INIファイルの排他制御を
実現することはできたのですが,排他制御を行ったアプリ自身も INIファイルに
アクセスできなくなってしまいます.
::CreateFile()の戻り値の HANDLE を使用するのかな,という気がするのですが,
使用方法がよくわかりません.
実現方法をご教授いただけませんでしょうか.
よろしくお願いいたします.
[環境] WinXP pro VC++6.0 SP5
環境を一部書き忘れてしまいました.
MFCを使用しています.
よろしくお願い致します.
以下のコードで問題なく排他制御しながらアクセスできました。
該当部分のコードを提示してみてはいかがでしょうか。
# コピペするときは全角スペース二つを適宜置換してください
# エラー処理やらなんやらは手抜きです
HANDLE hFile = CreateFile(
testlocked.locked,
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL, NULL );
if ( hFile == INVALID_HANDLE_VALUE ){
AfxMessageBox( failed to create locked file. );
}else{
Sleep( 15000 );
char* buff = test string.;
size_t size = strlen( buff );
char readBuf[200];
DWORD dwWritten = 0, dwRead = 0;
WriteFile( hFile, buff, size, &dwWritten, NULL );
SetFilePointer( hFile, 0, NULL, FILE_BEGIN );
ReadFile( hFile, readBuf, size, &dwRead, NULL );
readBuf[ dwRead ] = '\0';
AfxMessageBox( readBuf, MB_OK );
CloseHandle( hFile );
}
既にファイルを排他で開いているわけですから、
「GetProfileString() などを用いて,INIファイルにアクセスする」
というのは駄目というのはわかりますか?
INIファイルの解析に相当するものを自分でコーディングして
排他指定で開いているファイルハンドルを使えば出来ると思います。
もし、排他で開いているのに他の場所でOpenが出来てしまったとしたら、
排他制御の意味がありません。
INIファイルの解析というのはよく考えてコーディングすれば出来ないほど
難しいコードではないと思います。
GetProfileString等の関数を用いてという用件を変更すれば、
目的を達成することは可能だと思います。
もっともファイルをクローズして暗号化する直前のわずかな間や
暗号化終了後、平文のファイルを削除するまでのわずかな間が
存在するので絶対大丈夫とは言えないかも知れませんね。
これらの処理の途中でエラーが発生する可能性もありますしね。
らふさん,PATIOさん
素早いご返答,ありがとうございます.
> 既にファイルを排他で開いているわけですから、
>
> 「GetProfileString() などを用いて,INIファイルにアクセスする」
> というのは駄目というのはわかりますか?
やはりこれは不可能なのですね.
同じアプリ内なら可能だと思っていたのですが,ハンドルの理解が不十分
だったようです.
PATIOさんの
> GetProfileString等の関数を用いてという用件を変更すれば、
> 目的を達成することは可能だと思います。
とのご指摘と,らふさんに頂きましたサンプルコードを参考にさせていただき,
INIファイルの解析クラスを自作しようと思います.
> もっともファイルをクローズして暗号化する直前のわずかな間や
> 暗号化終了後、平文のファイルを削除するまでのわずかな間が
> 存在するので絶対大丈夫とは言えないかも知れませんね。
> これらの処理の途中でエラーが発生する可能性もありますしね。
仰るとおりです.
GetProfileString等の関数を使用しないならば,暗号化されたファイルのまま
INIファイルを解析することも可能だと思いますので,その方針で作成したいと
思います.
大変参考になりました.
ありがとうございました.
解決です