2007年01月29日

既存アプリのVista対応・改造計画:3回目「何が問題なのか:その1」

「Vistaでは改造しなくてはならない程の問題があるのか?」と疑問に思う人のために2つの例を紹介しておこう。

既存のアプリをそのまま使った場合にVistaでは一体どのような問題が発生するのか。
私の作ったオンライソフトにExit-Winという定期的にパソコンをシャットダウンさせるものがある。
このソフトには自動ログオンという機能があり、電源を入れたらログオン操作をしなくても自動的に指定したユーザーでログオンが完了するのであるが、これがVistaでは効かない。だが、Windows起動時に起動させるという機能は問題なく使える。どちらもレジストリを操作して実現する機能だが、一方が出来るのに何故他方は出来なくなるのか。
別の例をあげよう。メルプリTという自動でメールを受信し条件にあったメールのみを自動印刷するソフトの場合では、受信したメールの添付ファイルを参照しようとすると、それが見えない。印刷は問題ないのでファイルが無いわけではないのだが、XPまではちゃんと参照できたのにVistaではそれが出来ない。この機能にレジストリは一切関係ない。

それぞれの原因を解説すると、最初の問題はレジストリに関するもので「自動ログオン」の機能で使われるレジストリはHKEY_LOCAL_MACHINEにある項目であり、「Windows起動時に起動」で使われるレジストリはHKEY_CURRENT_USERにある項目である。
つまり、VistaではHKEY_LOCAL_MACHINEへの書き込みが禁止されているのである。しかもエラーは返らないので正常に処理されたと思ってしまう。
次の問題はフォルダに関するもので、一般的なインストーラーを使った場合、アプリケーションは既定フォルダである「Program Files」にインストールされる。ところが、インストール後アプリからは「Program Files」フォルダ内の書き込みが禁止されてしまう。そして、レジストリの時と同様エラーにはならなず、正常に書き込み終了するのである。

どちらも書き込み禁止なのにエラーにならないのは何故か?
それは特殊な場所にリダイレクト(転送)されているからだ。

下の図はMicrosoftの文書「Windows Vista Application Development Requirements for User Account Control Compatibility」(英語)。訳すと「ユーザアカウントコントロールの互換性のためのWindows Vista アプリケーション開発要件」にあったものをそのまま引用した図である。

リダイレクトされる様子

この図にある通り、プログラム上から確かにそれぞれの指定場所に書き出したとしてもOSが自動的にリダイレクトしてしまう。プログラム内部で処理する限り、別な場所に書かれたとは全く判らない。読み込みも自動的にリダイレクト先から読まれるので全くエラーすることなく処理は終わるのである。
しかし、別のプログラムからその場所を参照しようとすると話は別で、本来あるべきところに書き出されていないので問題が起きるのである。

HKEY_LOCAL_MACHINE内に書き出そうとした内容はHKEY_CURRENT_USER\Software\Classes\VirtualStore\MACHINE内に出力される。

\Program Files\(AppName)内に書き出そうとしたファイルは
\Users\(UserName)\AppData\Local\VirtualStore\Program Files\(AppName)内に出力される。

これを見ると、マシン固有のデータを直接いじることが出来ない。全て個別のユーザーデータとして覆い隠されてしまうことがわかる。


posted by なっちゃん at 22:53| 静岡 ☀| Comment(0) | TrackBack(0) | Windows Vista & 7 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。