3


0

「プログラムファイル」のINIファイルにアクセスできません

INIファイル(「preference.ini」)を確認し、最終的に変更する(例: ユーザーが紹介フォームをもう見たくない場合)。 WinXPで作成し、コンパイルしたシステム(「プログラムファイル」を含む多くの場所)で正常に動作します。

問題:

  1. Win 7では、完全なプログラムフォルダを下に置いても問題なく動作します 「C」:\」(例: 「C:\ MyProgram」)、しかし「C:\ Program Files(x86)\ MyProgram」に入れると、いくつかの不可解なデータ(INIファイルに存在しない値)を取得するだけです。 一部の設定を変更してファイルに保存すると、(明らかに)変更が保存されます(エラーは発生しませんが、ファイルを開いて開くと変更はありません…​)

  2. 別のWinXPシステムを搭載したシステムで同様の問題が発生しました( 私がそれをコンパイルしたもの。

'getcwd’を使用して実行時にパスを定義し、「Program Files(x86)」の下でも正しくパスしていることを確認しました。

char currentPath[MAXPATH];
getcwd(currentPath, MAXPATH);
std::string licensePath(currentPath);
licensePath.append("\\dat\\preference.ini");'

何か案は? ご協力ありがとうございます。

4 Answer


8


答えは、@ Kirillがすでに言っているとおりです。Win7では、通常より高いアクセス許可(管理者として実行)がない限り、プログラムファイルにデータを書き込むことはできません。 この場合、ファイルの書き込みをリダイレクトして、動作しているように見えるかもしれませんが、データ自体はProgam Filesに保存されていません。

彼の答えに追加するには:一般に(管理者としてアプリを実行する場合を除き)、プログラムデータをProgram Filesフォルダーに書き込まないでください。

アプリケーション設定は、AppDataフォルダーのいずれかに保存する必要があります。 スタートメニューの検索ボックス(Vista / Win7)に移動し、「%appdata%」と入力することで、ユーザーのappdataに手動でアクセスできます。

コード内でこの場所を見つけるには、http://msdn.microsoft.com/en-us/library/bb762181(VS.85).aspx [SHGetFolderPath]でCSIDL_APPDATA(現在のユーザー)またはCSIDL_COMMON_APPDATA(すべてのユーザー)を使用します。


3


Windowsがファイルシステムの仮想化を使用していることに関連している可能性があります。 あなたはそれについてhttp://support.microsoft.com/kb/927387 [こちら]を読むことができます。 INIファイルが `\ Users \\ AppData \ Local \ VirtualStore`にあるかどうかを確認してください。


0


licensePath:` getcwd() + "\\ dat \\ preference.ini" `は期待したものではないように思えます。

この値(コンソールまたはログファイル)をログに記録し、異なるフォルダーからプログラムを実行するときに `licencePath`の値が正確に何であるかを確認します。


0


この記事はゲーム開発に関するものですが、これがどのように、そしてなぜ起こるかについての最良の説明があり、私が見つけることができました

この記事のこの段落では、最も起こりそうなことについて説明しています。

_ アプリケーションに管理者権限がない場合、Windows Vistaでは、プロセスに書き込み権限を付与しないフォルダーの下にファイルまたはディレクトリを作成または書き込みしようとすると失敗します。 32ビットゲームの実行可能ファイルがレガシーモードで実行されている場合、要求された実行レベルを宣言しなかったため、書き込み操作は成功しますが、後述の「古いゲームとのUACの互換性」セクションで説明するように仮想化の対象となりますこの記事。 _