2024/01/18(木) [n年前の日記]
#2 [prog] iniファイルが妙な場所に作られてしまって悩んだ
C/C++を使った場合のiniファイルの読み書きの仕方も分かったし、設定ダイアログ上の値を読み書きする方法も分かったので、先日作成した「宇宙飛行」スクリーンセーバモドキのOpenGL描画プログラムをスクリーンセーバ化しようと作業を始めたのだけど…。
C:\Window\SysWOW64\ 以下に、スクリーンセーバのプログラム、.scr と、設定ファイル、.ini をコピーして、スクリーンセーバから .ini に設定を書き込もうとしたものの、.ini の内容が全く更新されなくて悩んでしまった。
スクリーンセーバの設定値は、たしかに変更されていて、設定ダイアログを開いても設定値がちゃんと反映されているのに、.ini の内容は以前と変わってない。何故。
試しに .ini ファイルを削除してみたけれど、その後もまるで .ini があるかのように動作してしまう。設定した値も読み取れている。しかし .ini ファイルは存在していない…。どういうこと…?
おそらくはどこか謎の場所に .ini があって、それを読み書きしているのだろうけど、一体どの場所に存在しているのか…。
Cドライブ内を検索しまくったところ、何故か以下のフォルダに .ini があった…。
C:\Window\SysWOW64\ 以下に、スクリーンセーバのプログラム、.scr と、設定ファイル、.ini をコピーして、スクリーンセーバから .ini に設定を書き込もうとしたものの、.ini の内容が全く更新されなくて悩んでしまった。
スクリーンセーバの設定値は、たしかに変更されていて、設定ダイアログを開いても設定値がちゃんと反映されているのに、.ini の内容は以前と変わってない。何故。
試しに .ini ファイルを削除してみたけれど、その後もまるで .ini があるかのように動作してしまう。設定した値も読み取れている。しかし .ini ファイルは存在していない…。どういうこと…?
おそらくはどこか謎の場所に .ini があって、それを読み書きしているのだろうけど、一体どの場所に存在しているのか…。
Cドライブ内を検索しまくったところ、何故か以下のフォルダに .ini があった…。
C:\Users\(USERNAME)\AppData\Local\VirtualStore\Windows\SysWOW64\ssstars_opengl.ini
◎ VirtualStoreのせいだった :
ググってみたところ、Windows Vista以降は、各種権限が厳しくなってシステム絡みのフォルダに書き込みができなくなっていたそうで。しかしそれでは昔のアプリが動かなくなってしまうので、VirtualStore という機能?を追加して、そちらを読み書きすることでどうにかしていたらしい…。
_Windows の VirtualStore 機能 - ラボラジアン
_VirtualStoreにやられた。。。 - ak days
C:\Windows\SysWOW64\ 内の .ini を読み書きしているつもりが、実際には、ユーザーフォルダ\AppData\Local\VirtualStore\ 内の .ini を読み書きしていたのだな…。だから C:\Windows\SysWOW64\ 以下の .ini を削除しても、何事もなかったように動いたわけで…。
さて、どうしたもんか。どうせユーザフォルダ内の VirtualStore\*.ini ファイルにアクセスしているなら、最初からユーザフォルダ内に設定ファイルを保存して読み書きするようにしてしまったほうがいいよな…。
となると、ユーザフォルダのPATHを取得する方法、AppData\Roaming\ 以下にスクリーンセーバ名でディレクトリを作る方法について調べないと…。
いや、本当にそれでいいのだろうか。もしユーザ名が日本語だった場合、正常にPATHを取得して読み書きできるのだろうか。それに、ユーザフォルダ内に謎の設定ファイルが勝手に作られるスクリーンセーバもなんだか怖くないか。アンインストールしたい場合はどうすればいいのか。
そう考えると、C:\Windows\SysWOW64\ 内に設定ファイルもあるものとして作っておいて、Windows Vista以降はここに設定ファイルがありますよとドキュメントで一言触れておくだけのほうがマシだったりしないか…。このあたり、どの方針が妥当なのだろう。
_Windows の VirtualStore 機能 - ラボラジアン
_VirtualStoreにやられた。。。 - ak days
C:\Windows\SysWOW64\ 内の .ini を読み書きしているつもりが、実際には、ユーザーフォルダ\AppData\Local\VirtualStore\ 内の .ini を読み書きしていたのだな…。だから C:\Windows\SysWOW64\ 以下の .ini を削除しても、何事もなかったように動いたわけで…。
さて、どうしたもんか。どうせユーザフォルダ内の VirtualStore\*.ini ファイルにアクセスしているなら、最初からユーザフォルダ内に設定ファイルを保存して読み書きするようにしてしまったほうがいいよな…。
となると、ユーザフォルダのPATHを取得する方法、AppData\Roaming\ 以下にスクリーンセーバ名でディレクトリを作る方法について調べないと…。
いや、本当にそれでいいのだろうか。もしユーザ名が日本語だった場合、正常にPATHを取得して読み書きできるのだろうか。それに、ユーザフォルダ内に謎の設定ファイルが勝手に作られるスクリーンセーバもなんだか怖くないか。アンインストールしたい場合はどうすればいいのか。
そう考えると、C:\Windows\SysWOW64\ 内に設定ファイルもあるものとして作っておいて、Windows Vista以降はここに設定ファイルがありますよとドキュメントで一言触れておくだけのほうがマシだったりしないか…。このあたり、どの方針が妥当なのだろう。
[ ツッコむ ]
以上です。