Virtual Store
Vista以降のOSでは、特に設定を行わずにサクラエディタを単品で起動させると、Virtual Storeが有効になります。
sakura.exe.manifestを設置することでUACに対応した動作になり、Virtual Storeを無効にできます。
*sakura.exe.manifestの内容は頁末参照
Virtual Storeとは
Program FilesフォルダーやWindowsフォルダー配下に設定を保存するようなVista未対応のアプリが、Vista上では急に動かなくなってしまうことが無いように設けられた互換性維持機能です。
Vista未対応アプリはVirtual Store有効で動作します。Virtual Store有効のアプリがProgram Filesのように保護強化されたフォルダーにファイルを保存しようとすると、目的のフォルダーではなくVirtual Storeと呼ばれる別のフォルダーにファイルが保存され、
以後、同じファイルを開こうとしたときにはVirtual Store側にあるファイルが開かれる仕組みになっています。
Virtual Store有効時の問題
Virtual Store有効のままでアプリを使用していると、そのアプリで保護フォルダーのファイルを操作したときに次のような混乱が起きます。
- 新規保存したはずなのにエクスプローラで見るとファイルが見つからない
- 上書き保存したのにメモ帳で見ると内容が更新されていない
- エクスプローラでファイルを上書きしたのに開いてみると更新されていない
アプリに適用されるVirtual Storeを無効にすれば、保護フォルダーへの書き込みは通常通り拒否され、保護フォルダーのファイルを開こうとしてVirtual Store側のファイルが開くこともないので、上記のような混乱も起きなくなります。
Virtual Storeを無効にする場合の注意事項
必ずユーザー別設定の機能を利用し、設定ファイル(sakura.ini)が非保護フォルダーに保存されるようにしてください。
その際、ユーザー別設定構成ファイルsakura.exe.iniの編集はデスクトップなどの非保護フォルダーで行い、編集後のファイルをエクスプローラでコピーしてください。
既に、ユーザー別設定を適用せずにProgram Filesにインストールして使用している場合はインストール先フォルダー下の設定ファイルやその他のファイルがVirtual Storeに転送されている可能性があります。
エクスプローラで確認して転送ファイルのほうを優先的に設定フォルダーにコピーしてください。
Program Filesではなく、保護対象外のフォルダーにインストールして使用する場合はユーザー別設定にする必要はありません。
1.5.17.0以前のバージョンではユーザー別設定に対応していないため、Virtual Store無効での利用ができません。
Virtual Storeに転送されたファイルの確認方法
フォルダーの仮想化されたファイル(Virtual Storeに転送されたファイル)を表示するにはエクスプローラのツールバーに表示される [互換性ファイル]ボタンをクリックします。
[互換性ファイル]ボタンは、そのフォルダーに仮想化されたファイルがある場合にのみ表示されます。
実際のパスは、たとえばProgram Files\sakuraにインストールされているとき、C:\Users\<username>\AppData\Local\Virtual Store\Program Files\sakura が転送先になります。
sakura.exe.manifestの内容
以下の内容のファイルをsakura.exeと同じ場所に保存します。sakura.exe.manifest自身がVirtual Storeに入らないように注意してください。
*デスクトップなどの非保護フォルダーで編集を済ませてエクスプローラでコピーなど。
Visual Styleを有効にし、Virtual Storeを無効(UAC対応)にする例です。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
name="sakura"
processorArchitecture="x86"
version="1.0.0.0"
type="win32"/>
<description>Sakura Editor</description>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="*"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="asInvoker" uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>