2007年02月10日

既存アプリのVista対応・改造計画:5回目「改造方法」

UAC(ユーザーアカウント制御)のダイアログで止まらずに自動起動させる必要のあるプログラムはどうすれば良いのだろうか。

結論を言えば、そのようなプログラムには管理者権限を必要としない処理だけをさせるようにするしかない。
書き込みは禁止されるが読み込みは問題なくできるのでレジストリに書き込まれた環境設定を読むだけなら管理者権限は必要ないのが幸いだ。
そして、環境を変更する時だけ、つまり環境設定画面で値を修正し「登録」ボタンを押したときにレジストリ等の管理者権限を必要とする書き込み処理を別プログラムに分離し、それにマニフェスト
を付けるのである。ユーザーインターフェースを持たないので、ユーザーからみれば保存時に確認ダイアログがでたような印象を受けるだろう。こうすることで煩わしいダイアログを必要最低限に抑えることができる。下図はこのモデルを表現したものだ。

改造モデル図

あと、インストーラーによるプログラムの保存場所は管理者権限を必要とするProgram Filesフォルダではなく、ドライブのルートを使うように変更させるようにする。Oracleなどは以前からドライブのルートにフォルダを作成してそこに一式インストールするがそれと同じである。
これで通常の作業でファイルを書き出す必要がある場合でも問題なく行うことでき、外部プログラムから参照しても問題なくアクセスできる。

※VB6のSetup.Lstファイルを次のようにするとインストールフォルダの初期値が変更できる。

通常の場合
[Setup]
Title=HOGE Ver.1.0.0
DefaultDir=$(ProgramFiles)\hoge
AppExe=hoge.exe
AppToUninstall=hoge.exe

Cドライブのルートに作成する場合、DefaultDirを変更する。
DefaultDir=C:\hoge
posted by なっちゃん at 23:38| 静岡 ?J| Comment(0) | TrackBack(0) | Windows Vista | このブログの読者になる | 更新情報をチェックする

2007年02月02日

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

前回、既存アプリが受ける代表的な問題点をあげた。それに対する一般的な対応策を紹介しつつ、実はそれでも問題が残ることを今回は取り上げる。

マシン固有の情報(HKEY_LOCAL_MACHINEレジストリとProgram Filesフォルダ、他にWindowsフォルダも同様)への書き込み制限を解除して書き込み可能にする方法は2つある。

一つはプログラムの互換性プロパティを開いて管理者権限を付与するもの。(下図参照)

互換性プロパティ

管理者権限でログインしている筈なのに何故また管理者権限を付与する必要があるのかと思うかもしれない。UAC(ユーザーアカウント制御)では管理者でも通常は一般ユーザ(Usersグループ)で動いているのである。
Vistaでは下図のようなダイアログを頻繁に見るようになるが、これこそ管理者権限に格上げする表明なのである。

ユーザーアカウント制御

もう一つは、上記プロパティの代わりにマニフェストとよばれる外部ファイルを配置するものだ。
hoge.exeというプログラムがあるとしたら、マニフェストはhoge.exe.manifestという名前になる。(プログラムファイル名).manifestが命名規則になっている。これをプログラムと同じフォルダに配置する。
内容は以下の通り。ファイル名のところを変更するだけで他は共通で使える。(※注)

マニフェスト
requireAdministrator が管理者権限で実行することを要求する。

この処置を施すことで従来通りの動きが保証される。だが、これがまた別の問題を生むのである。
管理者モードに格上げされるのは自動ではない。必ず前述したダイアログで待ったが掛かる。
前回紹介した私のオンラインソフトのExit-WinメルプリTなどは、Windows起動時に自動で起動し常駐するのが通常の使い方である。それなのに人手を介さないと先へ進まないのでは全く使い物にならない。

そこでどうするか。私の考えた一つの方法を次回紹介したいと思う。

※注:VB6のプログラムでもマニフェストは使えるが、ネイティブコンパイルしたEXEでないと使えないので注意。私のオンライソフトでネイティブコンパイルしたのは実は一つもない。というのもVB6のネイティブコンパイルはほとんど効果(速度)が期待できない中途半端なものだからだ。むしろファイルサイズが大きくなって起動に時間が掛かるマイナス面の方が大きいとさえ言える。(これはVB5が出た当時からの私の認識である)
posted by なっちゃん at 00:12| 静岡 ????| Comment(3) | TrackBack(0) | Windows Vista | このブログの読者になる | 更新情報をチェックする

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

2006年12月14日

VistaがそれまでのWindowsと大きく異なること

先月21日に開発者向けにVista日本語版(正規版)のダウンロードが可能になった。
これまでBeta2、RC2と使ってきたが所詮正規版でなければ本当の検証にはならないのでさっそくインストールしてみた。
検証が必要なのは仕事で開発したプログラムではなく、オンラインソフトの方である。仕事で使う方は無闇矢鱈と新OSに移行することはない。まして業務アプリを稼動させているPCであれば尚更だ。

オンライソフトは不特定多数のそれも個人ユーザーによって利用されることが多いので、プリインストール版が発売されたら即影響が出る。
ただWindowsXPまでは、ほとんど気にしていなかったし不具合もほとんど無かった。
ところがVistaのBeta2を使ってみてこれまでと全く違う動きに不安になった。セキュリティーがXP(SP2)以上に強固になっている。Administratorアカウントは最初から無効になっているし、設定変更にいちいち確認ダイアログボックスが出る。(ユーザーアカウント制御(UAC)と呼ばれるもの:下図参照)

Vista:UAC

これによりオンラインソフトの一部の重要な機能に問題(障害)が起きることが判った。

ツールと呼ばれるソフトウェアは、OSの使い勝手を良くする目的で作られる。
面倒な操作をしなくてもほぼ自動で事が済むという便利な機能を持つものだ。ところが、これらは悪意をもって使えばウィルスと同等なものになる。よってMicrosoftがセキュリティの強化でウィルスやワーム対策に力をいれた結果、便利なツールも同様にダメージを受けることになる。
仕方が無いと言えば仕方ない。でも、かなりのアプリケーションが影響を受けるだろうなぁ・・・。
posted by なっちゃん at 17:57| 静岡 ????| Comment(3) | TrackBack(0) | Windows Vista | このブログの読者になる | 更新情報をチェックする

2006年11月30日

ASP.NET 2.0 のベスト参考書

VisualStudio2005によるASP.NET 2.0での開発が始まった。
そこで、手っ取り早くASP.NET(1.1)との違いを知り、新しく追加されたコントロールを覚えるために使った参考書が山田祥寛氏の著作「10日でおぼえるASP.NET2.0入門教室」である。
山田氏の著作は、その判り易さとサンプルの実用性の高さでこれまでにもJava開発で大いに活用させてもらった。今回の本もその有用性は抜群である。(入門編とあなどる無かれ、ASP.NET2.0の技術仕様を解説でしっかり説明している。ここが他の類似参考書と一線を画す山田氏の著書の優れたところだ)
ファイルアップロードのサンプルは実際の開発で必要なものだったし、マスターページとコンテンツページの使い方、メニューの活用からデータベースの扱いまでほとんど全てが使える代物で、大助かりこの上ない!さすがMicrosoft ASP.NET MVPである。

なお、実際にこの本で学習するときにはサンプルコードをWebサイトからダウンロードしてからだが、サンプルがHTMLとプログラムが一体となった「コードインライン」モデルで既に作成済みなので、学習用には「コードビハインド」モデルを使って別名で新規作成しながら行うといいと思う。サンプルがHello.aspxであれば、Hello2.aspxとして作るといった具合である。実際の開発現場ではコードインラインモデルで作ることはまずありえないので。

10日でおぼえるASP.NET 2.0 入門教室
10日でおぼえるASP.NET 2.0 入門教室山田 祥寛

翔泳社 2006-08-03
売り上げランキング : 3666

Amazonで詳しく見る
by G-Tools

関連商品
Pocket詳解 ASP.NET辞典
プロが作った!すぐに使える! ASP.NET 2.0 実践サンプル集
Microsoft Visual Studio 2005によるWebアプリケーション構築技法
プログラミング Microsoft ASP.NET 2.0
ひと目でわかるMicrosoft SQL Server 2005
posted by なっちゃん at 09:52| 静岡 ????| Comment(0) | TrackBack(0) | ASP.NET Tips | このブログの読者になる | 更新情報をチェックする

2006年11月20日

VistaではMSDEも使えない

Vistaでは無償データベースのMSDEが非対応だという。そして「SQLServer2005Express」がそれに代わる。
MSDE1.0(SQLServer7相当)、MSDE2000(SQLServer2000相当)は、自分も利用したがいろんなアプリで利用されている。無償だから文句は言えない(?)けど、データベース本体の移行はさほど難しくもないが、アプリの方が先の開発ツールのVistaの対応状況との兼ね合いでそのまま使えない可能性がある。

MSDEはGUIのマネージャーが付いてないため何かと不便だったが、SQLServer2005Expressには別途無償の「SQL Server Management Studio Express」 をダウンロードして使えるのがかなり嬉しい。

ダウンロード先は下を参照
http://www.microsoft.com/downloads/details.aspx?familyid=C243A5AE-4BD1-4E3D-94B8-5A0F62BF7796&displaylang=ja

どう転んでも仕事は増えそうだ(^^;
posted by なっちゃん at 15:16| 静岡 ?J| Comment(0) | TrackBack(0) | ETC | このブログの読者になる | 更新情報をチェックする

2006年11月10日

次期OS「Vista」ではVisualBasic6はサポートされるが、VisualStudio.NET2002,2003はサポートされないんだと

http://www.microsoft.com/japan/msdn/vstudio/support/windowsvista/faq/
上記リンクにMicrosoftの言い分が載っている。

NET Frameworkが出現し、いずれVB6は対応しなくなる可能性があるからわざわざ.NETに移行した開発者はバカをみた事になるのか。そのままVB6で開発していればまだ生き長らえたかもしれないのにね。

開発ツールがサポートされなくなるだけでアプリケーションは動くらしい。でも開発できないんじゃやっぱりVS2005に移行させるしかないじゃん。VB6からの移行に比べたら何でもないけど・・・。

VB6のサポートを決めたのは、世にVB6アプリが沢山あって、歴史の浅い.NETアプリなんかよりずっと沢山の人々が使っているからなんだろう。
だったらVB2005の後はVB9としてアンマネージコードも作成できるようにして欲しいよ。

Windows VistaのBeta2とRC2を使っているけど、操作方法がいろいろ変わってまた覚えないといけない。XPが出たときもそうだったが、ベテランほどストレスが溜まるんだ。OSを独占している現在の状態が問題なのは言うまでも無い。Microsoftの意向が神の御告げのようにユーザーに降りかかるのである。
Linuxのように無料かそれに近い安さで公的な資産とし、ディストリビュータ毎にカスタマイズして競争させれば、一番使い勝手の良いものが売れるようになるだろうから、操作性もそう大幅に変わることも無いだろうにと思う。
posted by なっちゃん at 17:19| 静岡 ????| Comment(0) | TrackBack(1) | VB vs VB.NET | このブログの読者になる | 更新情報をチェックする

2006年11月08日

ファイルとフォルダの存在を確認するおそらく一番楽な方法(VB6用)

VB6だけのTipsを公開するのは今回が初めてです。
ここ1年半程、仕事でVB6を使って開発することがない(バグ修正を除けば)。
しかしオンラインソフトはほとんどVB6で作っているのでバリバリのVB6使いであることに変わりない。
近く公開予定のフリーソフト「ファイルとフォルダの神隠し」を作っているときに思いついた便利な方法を内緒で教えます。

ファイルの有無・フォルダの有無をチェックするには例えばFileSystemObjectを使ったスクリプトがよく知られている。が、ファイル用とフォルダ用が別のメソッドになっている。これでは事前にファイルかフォルダか判定してからでないと使えない。

それを事前チェック無しで、ファイルかフォルダかも判定して存在をチェックする方法が以下の簡単な記述でできる。今までこの倍もあるコードを書いてしかもフォルダチェックはダミーの書き込みまでしていたから(そこではDir関数で判定していた)自分でも唖然としている。頭と関数は使い様だと思った。


'//// ファイル及びフォルダの有無チェック(タイプを返す) /////
' 0=フォルダ、1=ファイル、-1=存在しない
'-----------------------------------------------------------
Public Function Exists(ByVal strPathName As String) As Integer
'strPathName : フルパス名
'------------------------
Dim ret As Integer
On Error GoTo CheckError
If (GetAttr(strPathName) And vbDirectory) = vbDirectory Then
Debug.Print strPathName & "はフォルダです。"
ret = 0
Else
Debug.Print strPathName & "はファイルです。"
ret = 1
End If
Exists = ret
Exit Function
 
CheckError:
Debug.Print strPathName & "が見つかりません。"
Exists = -1
End Function
 
'//// ファイル及びフォルダの有無チェック(有無のみ判定) /////
' True=存在する、False=存在しない
'-----------------------------------------------------------
Public Function Exists2(ByVal strPathName As String) As Boolean
'strPathName : フルパス名
'------------------------
On Error GoTo CheckError
If (GetAttr(strPathName) And vbDirectory) = vbDirectory Then
Debug.Print strPathName & "はフォルダです。"
Else
Debug.Print strPathName & "はファイルです。"
End If
Exists2 = True
Exit Function
 
CheckError:
Debug.Print strPathName & "が見つかりません。"
End Function


解説すると、(GetAttr(strPathName) And vbDirectory) = vbDirectory を実行し、エラーすれば存在しないパスだと判るしTrueであればフォルダであり、Falseであればファイルだというのだ。
実に判りやすい。
続きを読む
posted by なっちゃん at 18:45| 静岡 ????| Comment(0) | TrackBack(0) | VB Tips | このブログの読者になる | 更新情報をチェックする