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 | このブログの読者になる | 更新情報をチェックする

2007年01月27日

既存アプリのVista対応・改造計画:2回目「開発環境での不具合−SendKeys」

MicosoftがVistaではVB.NETとVB.NET2003をサポートから外し、VB6をサポートすると発表したことは以前にも紹介した。しかしVista上で動かしたところVB6の開発環境で変な現象を見つけた。

VB6のTipsの中でもよく紹介されるものに、テキストボックスでEnterキーを押したら次のテキストボックスにフォーカスを移動させるものがある。DOS時代のアプリの操作性を再現するためである。
この方法には KeyPressイベント内で SendKeys "{TAB}" を実行することで可能だが、どういうわけか作成したプログラム(EXE)では問題ないのに、開発環境で動かすとエラーになる。

下図1・2・3を参照

図1:フォームにテキストボックス2つとコマンドボタン1つ
サンプルフォーム

図2:実行させ、テキストボックスでEnterキーを押すとエラーが発生
エラー発生

図3:デバッグしてみるとSendkeysのところでエラーしたのがわかる。
エラー箇所

この点について、Microsoftのサポート技術情報に同様の問題がOffice2003のVBAで発生することが載っていた。(手持ちのOffice2000でも同じ現象を確認した。)
http://support.microsoft.com/kb/931136/ja

Sendkeysは外部のアプリケーションを操作するときにも使う。
私のオンラインソフトScreenCutterではキャプチャーした画像をOutlookExpressに添付画像として自動で貼り付ける機能に利用されているが、これがVistaではうまく働かなかった。悩んだ挙句 Win32APIのkeybd_eventを使うことで正常に動作するようになったが、先に述べたようにSendkeysを使ってもEXEからでは外部アプリの操作は大抵のものはちゃんと動くのだ。
posted by なっちゃん at 22:02| 静岡 ????| Comment(0) | TrackBack(0) | Windows Vista | このブログの読者になる | 更新情報をチェックする

2007年01月25日

既存アプリのVista対応・改造計画:1回目「前置き」

いよいよVistaが市場に出回る。昨夜のNHK・クローズアップ現代ではエンドユーザーの立場からVistaへの乗り換え問題とXPのサポート期限問題を扱っていたが、開発者の立場からも重大な問題がある。
一言で言えば、それは、既存アプリの動作保証問題である。これまで、のほほんとほとんど注意を払ってこなかった私のようなオンラインソフトプログラマーにとって死活問題とまでは行かないまでも(^^;かなりの労力と注意を強いる問題といえる。実際、昨年末から正月休みの間、私はほとんどこれに掛かり切っていた。
そして、一応満足のできる対策と方針をまとめることができた。
これより数回に分けてその方法を紹介していきたいと思う。すでにいろんなIT関連サイトでもVistaの仕様の問題を扱っているが、ここでは具体的・実践的な対応を紹介する。別にVista対応のロゴマークを取得するのが目的ではなく、これまで通り、アプリケーションがVista上でも支障なく動いてくれるのを唯一の目的としている。またできる限りユーザーを煩わせない方法で対応させることに力を注いだ。
内容は私の公開しているオンラインソフトを実例にとって話を進める。
VisualBasic6のプログラムを扱っているがVB.NET、VB2005でも同様に起きるものであるから参考になると思う。
posted by なっちゃん at 17:51| 静岡 ????| Comment(0) | TrackBack(0) | Windows Vista | このブログの読者になる | 更新情報をチェックする