「電波とどいた?」
2007/02版 その1

2007/02/04 (日)

VISTA 対応 (吉里吉里)

_ Vista で UAC が有効な場合、Program Files 以下にインストールすると、 その場への書き込みが、UAC の作用で、ユーザフォルダに転送されます。 その働きで、本体は特に問題なく普通に動くねー、と思ってたらいろいろ罠が。

  1. 吉里吉里の「エンジン設定.exe」が、管理者権限※がないとエラー。実行ファイル自体は UAC の対象にならない。
  2. CD/DVD の autorun で起動されると UAC が走って「管理者権限」が付加される。 そのランチャーをからアプリを起動するとそのまま「管理者権限」で動作する。 「管理者権限」で動くと UAC が作用せず、Program Files 以下にセーブデータが書き込めてしまう
  3. メニューやデスクトップから起動した場合は、そのユーザ権限で動いて UAC が働くのでセーブデータが多重化してしまう

※アカウントの種類「管理者」ではだめ。「管理者として実行」などで権限を特別に昇格する必要あり

_ 対策〜

_ 「エンジン設定.exe」は、tof ファイルをつくっておけばそちらにアクセスに行くのでそれで UAC が正常に働いて問題なし。ただし現行の正式版の吉里吉里はバグがあって、tof があっても 書き込み権限を調べてエラーになるので、開発版の最新を入手して使う必要あり。 こちらで修正済

(追記) 最新系列吉里吉里では .cf ファイルを参照するように仕様変更されています。 メインの .cf で dataPath をユーザフォルダに指定させ、エンジン設定.exe が書き込む .cfu ファイルは個別ユーザにわけるように調整するのが適切です

_ 権限まわりの対策: 全部管理者権限で動作させる……と 全部起動のたびにきいてくるのでうざい&それはいくらなんでもセキュリティ的に どうかとということでまじめに対応……

_ ランチャープログラムは、requestExecutinLevel level="asInvoker" の manifest をつけると AUTORUN 時の権限アップの対象にならなくなるのでそれで対応。詳細はぐぐれ。

具体的には以下のような hoge.exe.manifest をつくって、Visual Studio 2005 のプロジェクトのプロパティの 構成プロパティ/マニフェストツール/入力と出力/追加のマニフェストファイル で指定すればよろし。 name のとこは適当にかえてね。


<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity version="1.0.0.0" processorArchitecture="X86" name="wamsoft.startup" type="win32"/>
<ms_asmv3:trustInfo xmlns:ms_asmv3="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="asInvoker"/> 
</requestedPrivileges>
</security>
</ms_asmv3:trustInfo>
</assembly>

逆にインストーラは管理者権限で動かす必要があるので、RequireAdministrator をつける必要あり。 あるいは単に setup.exe という名前で OK ぽいです ^^; なお、XP SP2 で「制限つきユーザ」を使った場合も setup.exe は権限昇格が発生するようです。 (追記)インストーラにマニフェストで RequireAdministrator をつけると管理者権限に昇格させることができますが、 制限つきユーザのことを配慮した場合、インストーラに対して適切なマニフェストは highestAvailable に なります。この指定にしておくと、インストーラ起動時にユーザ権限に応じて適切な昇格ダイアログが 表示され、管理者権限でインストーラを動作させるか、あるいはそのユーザの権限で動作させるかを 選択させることができます。

_ この設定でランチャ─を作成すると、ランチャ─からインストーラを起動する時に CreateProcess() を使うと権限昇格できなくてエラーになるので、UAC を正常に作用 させるためには、ShellExecute() を利用して起動する必要があります。ランチャ─で 起動したプロセスを待つ必要がある場合は ShellExecuteEx() が利用できます。 ちなみに InstallShield は途中でプロセスをきりかえちゃうので、処理を待つには また別の対策が必要だけどそれは以前からのものなので詳細はパス。

_ これで、AUTORUN 起動したランチャー経由の場合も、手動で起動した場合も、起動される アプリのコマンドは通常権限で、インストーラ(setup.exe) は管理者権限で動作昇格して管理者権限、 あるいはそのままの権限で動作することになるので全体として一貫性がとれて問題なし。ふう、めんどくさかった……

_ あとインストーラは指定した管理者ユーザ扱いで走るので「そのユーザのみ」だと、 インストールを開始したユーザのスタートメニューやデスクトップのリンクが 起動したユーザのところにはできないので「全てのユーザ」縛りにすることが必要。 (追記) インストーラは管理者権限の有り無し2パターンで調整を行なう必要があります。 管理者権限が無い場合は、MyDoc の下や、AppData の下など、確実に書き込みできる 場所などにデフォルトのインストールフォルダを変更するのが妥当です。 アンインストール情報を書きこむ先もCURRENT_USER の場所にします。 管理者権限がある場合はデフォルトのインストール先を Program Files 以下に指定できます。 あと、権限昇格の関係で、起動ユーザとインストーラを実行しているユーザが異なる場合が あるので、スタートメニューやデスクトップのリンクの整合を配慮するなら「全てのユーザ」 縛りにしてしまうのがわかりやすいです。

_ なお、インストール&動作時の権限はさておき、セーブデータについては本来は 実行ファイルのある場所じゃない場所(AppData とか MyDocument とか)が正統です。 そうすると、 各種OSや、個別の場所にインストールしたときとかとの場合わけを 網羅するのがまた面倒で……。AppData 固定にしてデータのインポート/エクスポートを つくるのが一番いい気はしますです。はい。まあ、それは面倒なのでまた今度。 (追記) 実行ファイルのフォルダ(VistaかつProgram Files 以下なら禁止)、 MyDoc 以下、AppData 以下からユーザに選択させて、それに応じて .cf を生成して 配置するようにインストーラ側で対応すれば、吉里吉里自体はそれに応じて問題なく 動作します。アンインストール時もその .cf をみれば適切なアンインストール判定が行なえます。 いずれにしてもデータのインポート/エクスポートは機能として搭載したほうがユーザに親切です。

_ もひとつ吉里吉里を Vista ではしらせた時にあった問題。 Vista で Aero が有効な場合、ムービーを拡大して再生するとジャギジャギになる模様。 XP 以前でもデバドラやアクセラレーションの指定次第では発生するので、 ドライバ側の処理の問題な気はするのですが……。まあ、拡大しないようにそのままの サイズでムービーつくるのが無難かな……。 ムービーの「オーバレイ」指定自体は特に問題なく動くようです。

_ あ、あと、署名が無いことがひたすら表示されるので、署名されてないとかっこわるいね^^;

_ 余談。KAGEX を Program Files 以下にインストールされている場合の XP の「制限つきユーザ」用にまじめに 対応してみた。副作用でたぶん CD-ROM/DVD-ROM から直接起動した時も普通に保存して遊べるようになってるはず。

(追記) 各社の対応状況の記録ということで ゲームソフトのVista対応比較。 螺旋回廊が一番まともかしら。ゆずソフトの「ExE」も比較用にチェック希望(ぉ



2007/02/05 (月)

ギャルゲーの対語 (乙女ゲーム)

その概念に対しては、 すでに「乙女ゲーム」という名称が定着してます。元祖はアンジェリークになるのかな。 最近は18禁作品もいろいろ。




メールはこちらへ...[わたなべごう (go @(at) denpa .(dot) org)]

この日記は、GNSを使用して作成されています。