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>