Windowsサービスを作成したが、動作がおかしいのでデバッグすることになった。
その時のデバッグ操作が結構てこずったので注意書きとしてまとめておく。
デバッグの方法はWindowsプログラムとはちょっと違う。WindowsプログラムではDebugモードで実行させるだけで済むがサービスプログラムは実際にサービスとして稼動させてから開発ツールでそのプロセスを監視させて行う。
ここで注意すべきなのはWindowsプログラムと同様にビルドの構成をDebugにしておく必要があることだ。(過去ログ:ブレークポイントで止まらないを参照)
サービスプログラムを実行させるには
(Windows)\Microsoft.NET\Framework\(バージョン)\installutil.exe を使ってインストールする必要がある。コマンドプロンプトから実行するので私の場合は、このコマンドだけをサービスプログラムの実行ファイル(exe)のあるフォルダ(bin\debug)にコピーして、そこからインストールしている。
InstallUtil.exe (サービスプログラム名).exe
※Vistaの場合コマンドプロンプトを管理者として実行させておかないとインストールに失敗する。
インストール後、サービスがまだ開始されていないのでコントロールパネルの管理ツールからサービスマネージャを開いて開始させる。
あとはデバッグポイントを設定し、「ツール」メニューにある「プロセスにアタッチ」を開き「選択可能なプロセス」から当サービスプログラムを選択し「アタッチ」ボタンをクリックする。このとき「すべてのユーザーからのプロセスを表示する」と「すべてのセッションのプロセスを表示する」にチェックを入れておかないとサービスプログラムは表示されない。
プロセス一覧には(プログラム名).vshost.exeというファイル名がグレー表示しているが、これはサービスプログラムのプロジェクトを開いている開発ツールのことだ。
なお、上記手順から判るようにサービスプログラムの起動時(OnStartイベント)のデバッグは出来ない。(開始されていないサービスは選択可能なプロセス一覧には表示されず、表示されたときは既にOnStart内のコードは終了しているから)
デバッグで問題点が見つかり修正する場合、一時サービスを停止しておかないとプログラムの置き換えができない。またサービスをアンインストールするときも停止する必要がある。
アンインストールのコマンド以下の通り
InstallUtil.exe /u (サービスプログラム名).exe
2009年06月06日
2009年05月07日
Windows7の「Windows XP Mode」
Windows7のRC版の公開のアナウンスと共に興味深い記事があった。
それが「Windows XP Mode」と呼ばれるものだ。これはWindows7とは別に提供される。
http://www.microsoft.com/windows/virtual-pc/download.aspx
アナウンスでは「Professional」「Enterprise」「Ultimate」エディションでしか使えないらしい。RC版はUltimateだから試すことができる。
「Windows XP Mode」の実体は、別途起動させた「Virtual PC」 から特定のアプリケーションだけを表示させて、あたかもWindows7で起動しているかのように見せるものである。
ちなみに、ウィンドウデザインはXPそのままなので、Vista以降の新しいインターフェースのウィンドウに混じって表示されると変な感じがするが、XP Modeで起動しているのが一目でわかる。
この新しい「Virtual PC」を使うには幾つか制限がある。
まず一番の障害になると思われるのは、プロセッサー(CPU)で「ハードウェア依存の仮想化機能」がないと使用できないことである。最近のCPU(AMDのAMD-VやIntelのIntel-VTが組み込まれたCPU)でないと使えない。ちなみに私がテストしたのはAMDのAthlon 64X2である。
・非対応のCPUだと下図のようなエラーが出る。

またWindows7から起動させるためには、あらかじめ作成したVirtualXPにプログラムをインストールする必要があるが、必ず全ユーザー用のスタートメニューのプログラムフォルダにショートカットを作成しないといけない。
インストーラーが自動で作る場合なら楽だがフリーソフトなどインストーラが無い場合、またあってもログインユーザーだけのプログラムフォルダに作成するものだと、自前で作らないといけない。
・下図参照

スタートメニューの「Virtual Windows XP」フォルダに「Virtual Windows XP アプリケーション」フォルダが作成され、その中にショートカットがあるが、これはVirtual Windows XP の「C:\Documents and Settigns\All Users\スタート メニュー\プログラム」フォルダ内に新規作成されたショートカットが表示されたものだ。
もう一つの制限は、起動元がVirtualPCなので読み書きするドライブもVirtual PC上にあるドライブになることだ。VirtualPC側でホスト側(Windows7)OSのドライブを仮想化してドライブに割り当てることができるが、ホスト側と同じドライブ名にはならないし、ドキュメントフォルダも異なる。 (これは間違いで、マイドキュメント、マイピクチャーに保存するとホスト側のマイドキュメント、マイピクチャーに保存された。どうやらリダイレクトされているようだ。)
アプリケーションが単独で動作し、他の影響を受けないような場合には使えるだろうが、外部と連携したりする場合には使えない問題がある。
また当然ながらキャプチャーソフトなどは全く使い物にならない。
Windows7で起動しているように見えても、実体はVirtualXP上にあるのでキャプチャーしている画面空間が見えているものと異なっているのだ。
・下図参照
自作ソフト「ScreenCutter」がキャプチャーしたのはWindows7のデスクトップではなくVirtualPC上のデスクトップらしき一部である。
クリップボードの内容はホスト側と共有するのでホスト側でコピーしたものはVirtual側にも伝わるが、Virtual側のクリップボード取得では意味がない。
以上の点から「Virtual XP mode」は、あくまでもVirtual PCであり、仮想PC上にインストールしたアプリケーションをちょっと楽に起動できるようにしただけのものだ。Windows7で互換モードで起動したものではない。だからシステムに関わるようなツール、たとえばアンチウィルスソフト等をこのXPモードで使うことはナンセンスなのだ。
なお、試用したものはベータ版であり、正規版までにどう改善されるかも注目しておこう。
補足:
従来のVirtualPCとの違いを言うと、単独のVirtualPC2007とも違う。
というのも、「終了」の代わりに「切断」ボタンがある。つまりVirtualPCにリモートデスクトップで接続しているという感じなのである。
他にUSBメモリが使えるようになったのは良いが、Virtual側で使うとホスト側から使用できなくなるのは改善して欲しい。
それが「Windows XP Mode」と呼ばれるものだ。これはWindows7とは別に提供される。
http://www.microsoft.com/windows/virtual-pc/download.aspx
アナウンスでは「Professional」「Enterprise」「Ultimate」エディションでしか使えないらしい。RC版はUltimateだから試すことができる。
「Windows XP Mode」の実体は、別途起動させた「Virtual PC」 から特定のアプリケーションだけを表示させて、あたかもWindows7で起動しているかのように見せるものである。
ちなみに、ウィンドウデザインはXPそのままなので、Vista以降の新しいインターフェースのウィンドウに混じって表示されると変な感じがするが、XP Modeで起動しているのが一目でわかる。
この新しい「Virtual PC」を使うには幾つか制限がある。
まず一番の障害になると思われるのは、プロセッサー(CPU)で「ハードウェア依存の仮想化機能」がないと使用できないことである。最近のCPU(AMDのAMD-VやIntelのIntel-VTが組み込まれたCPU)でないと使えない。ちなみに私がテストしたのはAMDのAthlon 64X2である。
・非対応のCPUだと下図のようなエラーが出る。
またWindows7から起動させるためには、あらかじめ作成したVirtualXPにプログラムをインストールする必要があるが、必ず全ユーザー用のスタートメニューのプログラムフォルダにショートカットを作成しないといけない。
インストーラーが自動で作る場合なら楽だがフリーソフトなどインストーラが無い場合、またあってもログインユーザーだけのプログラムフォルダに作成するものだと、自前で作らないといけない。
・下図参照
スタートメニューの「Virtual Windows XP」フォルダに「Virtual Windows XP アプリケーション」フォルダが作成され、その中にショートカットがあるが、これはVirtual Windows XP の「C:\Documents and Settigns\All Users\スタート メニュー\プログラム」フォルダ内に新規作成されたショートカットが表示されたものだ。
もう一つの制限は、起動元がVirtualPCなので読み書きするドライブもVirtual PC上にあるドライブになることだ。VirtualPC側でホスト側(Windows7)OSのドライブを仮想化してドライブに割り当てることができるが、ホスト側と同じドライブ名にはならないし、
アプリケーションが単独で動作し、他の影響を受けないような場合には使えるだろうが、外部と連携したりする場合には使えない問題がある。
また当然ながらキャプチャーソフトなどは全く使い物にならない。
Windows7で起動しているように見えても、実体はVirtualXP上にあるのでキャプチャーしている画面空間が見えているものと異なっているのだ。
・下図参照
自作ソフト「ScreenCutter」がキャプチャーしたのはWindows7のデスクトップではなくVirtualPC上のデスクトップらしき一部である。
クリップボードの内容はホスト側と共有するのでホスト側でコピーしたものはVirtual側にも伝わるが、Virtual側のクリップボード取得では意味がない。
以上の点から「Virtual XP mode」は、あくまでもVirtual PCであり、仮想PC上にインストールしたアプリケーションをちょっと楽に起動できるようにしただけのものだ。Windows7で互換モードで起動したものではない。だからシステムに関わるようなツール、たとえばアンチウィルスソフト等をこのXPモードで使うことはナンセンスなのだ。
なお、試用したものはベータ版であり、正規版までにどう改善されるかも注目しておこう。
補足:
従来のVirtualPCとの違いを言うと、単独のVirtualPC2007とも違う。
というのも、「終了」の代わりに「切断」ボタンがある。つまりVirtualPCにリモートデスクトップで接続しているという感じなのである。
他にUSBメモリが使えるようになったのは良いが、Virtual側で使うとホスト側から使用できなくなるのは改善して欲しい。
Windows7 RC版をインストール
Windows7のRC版がダウンロードできるようになった。
http://www.microsoft.com/windows/windows-7/download.aspx
http://technet.microsoft.com/ja-jp/evalcenter/dd353205.aspx?ITPID=mscomsc
試してみたが見た目は、前回のベータ版と比べてインストール時の画面が綺麗になり、日本語表記も増えている程度である。
今回の目玉は「Windows XP Mode」というVirtual PCの機能を使った新たな互換性機能がどうなったかということだが、これは別途ダウンロードする必要がある。
http://www.microsoft.com/windows/virtual-pc/download.aspx
これについては次回に解説する。




http://www.microsoft.com/windows/windows-7/download.aspx
http://technet.microsoft.com/ja-jp/evalcenter/dd353205.aspx?ITPID=mscomsc
試してみたが見た目は、前回のベータ版と比べてインストール時の画面が綺麗になり、日本語表記も増えている程度である。
今回の目玉は「Windows XP Mode」というVirtual PCの機能を使った新たな互換性機能がどうなったかということだが、これは別途ダウンロードする必要がある。
http://www.microsoft.com/windows/virtual-pc/download.aspx
これについては次回に解説する。
2009年04月21日
VB2005(VB.NET)のNotifyIconからのフォーム表示の問題点
タスクトレイにアイコンを表示させる時、VB6の時はかなり面倒な処理をする必要があったが、VB.NETではNotifyIconコントロールという大変便利なものがある。
今回これを使ったプログラムを作っていて問題が見つかった。
それは、タスクトレイに表示されたアイコンをクリックしてフォームを開くとき、そのままではアクティブになっていないのである。
たとえば、パスワードを入力させるためにパスワード用フォームを開いてもキー入力を受け付けないのである。一回フォームをクリックしてアクティブにしてからでないとキー入力できないというのでは使い勝手が悪い。これが別のフォーム上のButtonコントロールから開くときにはちゃんとアクティブになっているのだから始末が悪い。
何とかアクティブにならないかと悪戦苦闘してみたが100%確実にアクティブにする方法が見つからない。
ところがやっと見つかった解決策は実に単純だった。
フォームのLoadイベントのなかで、Me.Activate() と一行追加するだけで解決した。
やれやれ(^^;
今回これを使ったプログラムを作っていて問題が見つかった。
それは、タスクトレイに表示されたアイコンをクリックしてフォームを開くとき、そのままではアクティブになっていないのである。
たとえば、パスワードを入力させるためにパスワード用フォームを開いてもキー入力を受け付けないのである。一回フォームをクリックしてアクティブにしてからでないとキー入力できないというのでは使い勝手が悪い。これが別のフォーム上のButtonコントロールから開くときにはちゃんとアクティブになっているのだから始末が悪い。
何とかアクティブにならないかと悪戦苦闘してみたが100%確実にアクティブにする方法が見つからない。
ところがやっと見つかった解決策は実に単純だった。
フォームのLoadイベントのなかで、Me.Activate() と一行追加するだけで解決した。
やれやれ(^^;
2009年04月15日
アプリケーション情報(VB6とVB2005)
| アプリ情報 | VB6 | VB2005 |
|---|---|---|
| 実行パス | App.Path | My.Application.Info.DirectoryPath |
| 実行ファイル名 (拡張子を除く) | App.EXEName | My.Application.Info.AssemblyName |
| メジャー番号 | App.Major | My.Application.Info.Version.Major |
| マイナー番号 | App.Minor | My.Application.Info.Version.Minor |
| ビルド番号 | (該当無し) | My.Application.Info.Version.Build |
| リビジョン番号 | App.Revision | My.Application.Info.Version.Revision |
| バージョンの構成 | (Major.Minor.0.Revision) | (Major.Minor.Build.Revision) |
| タイトル | App.Title | My.Application.Info.Title |
| ファイルの説明 | App.FileDescription | |
| 会社名 | App.CompanyName | My.Application.Info.CompanyName |
| コメント | App.Comments | My.Application.Info.Description |
| ヘルプファイル名 | App.HelpFile | (該当無し) |
| 著作権情報 | App.LegalCopyright | My.Application.Info.Copyright |
| 商標 | App.LegalTrademarks | My.Application.Info.Trademark |
※バージョン情報については、こちらも参考に→「自アプリケーションのバージョンを取得」
2009年03月27日
デフォルトボタンの指定方法
VB6では、Enterキーを押すと自動で応答するボタンをDefaultプロパティをTrueにすることで指定できた。
VB.NET(2005,2008含)になってその方法が変わり、フォームのAcceptButtonプロパティでボタンの名前を指定する。


同様にESCキーに応答させるVB6のボタンのCancelプロパティは、VB.NETではフォームのCancelButtonプロパティになる。
VB.NET(2005,2008含)になってその方法が変わり、フォームのAcceptButtonプロパティでボタンの名前を指定する。
VB6のサンプル画面
VB6:
Private Sub Text1_Change()
If Text1.Text = "" Then
Command1.Default = False
Else
Command1.Default = True
End If
End Sub
VB2008のサンプル画面
VB.NET:
Private Sub TextBox1_TextChanged(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles TextBox1.TextChanged
If TextBox1.Text = "" Then
Me.AcceptButton = Nothing
Else
Me.AcceptButton = Button1
End If
End Sub
同様にESCキーに応答させるVB6のボタンのCancelプロパティは、VB.NETではフォームのCancelButtonプロパティになる。
2009年03月25日
SQL Server Browserの使い道
SQLServer2005Expressをインストールすると本体(SQLServer)と一緒にSQLServerBrowserがサービスに組み込まれるが、これまで全く使っていなかった。
既定でも無効になっているのでどういう使い道があるのか知らなかった。
たまたま仕事でAccessデータベースをSQLServerに移行させる必要があり、サーバ機を用意するほどの予算もないので既存のXPマシンにExpress版をインストールして使うことになったとき、ODBC経由でネットワーク接続しようとしてODBCデータソースが作成できなかったことから調べていって判ったことである。
通常SQLServerのTCPポートは1433番固定なのだが、Express版は動的ポートが採用されている(今回初めて知った)。
そこでリモートから接続しようとするときどのポートに接続したらいいのか調べる必要があるが、それを行ってくれるのがSQL Server Browserというのである。
またXP(sp2適用)ではファイヤーウォールが有効になっているため、外部からSQLServerサービスとSQLServerBrowserサービスに接続するには、必要なポートを開ける必要がある。
実のところこれまではデータベースサーバとしてWindowsServer2003を使っていた。2003ではファイヤーウォールは既定では無効になっていたので意識する必要がなかったのだ。
固定ポートを使用していればファイヤーウォールの設定はそのポート番号を許可させるだけでよいが動的ポートの場合にはそれができない。
そこでサービスプログラム本体(sqlserver.exe)を許可させたあと、SQLServerBrowserサービスを使ってインスタンス名からポート番号を探る必要がるので、こちらも許可させる必要がある。なお、こちらはUDPの1434番(固定)を指定するか、sqlbrowser.exeを指定する。
詳しいことは下のサイトに紹介されている。
http://www.atmarkit.co.jp/fdotnet/dotnettips/545sqlsvrnet/sqlsvrnet.html
なお、余談だが今回Access2000のデータベースをSQLServer2005Express版に移行するのにAccess2000のアップサイジングウィザードを使ったところ「オーバーフロー」のエラーが発生した。この原因を調べたところAccess2000のバグのようでOffice2000ServicePack3を当てることで正常に変換できた。
既定でも無効になっているのでどういう使い道があるのか知らなかった。
たまたま仕事でAccessデータベースをSQLServerに移行させる必要があり、サーバ機を用意するほどの予算もないので既存のXPマシンにExpress版をインストールして使うことになったとき、ODBC経由でネットワーク接続しようとしてODBCデータソースが作成できなかったことから調べていって判ったことである。
通常SQLServerのTCPポートは1433番固定なのだが、Express版は動的ポートが採用されている(今回初めて知った)。
そこでリモートから接続しようとするときどのポートに接続したらいいのか調べる必要があるが、それを行ってくれるのがSQL Server Browserというのである。
またXP(sp2適用)ではファイヤーウォールが有効になっているため、外部からSQLServerサービスとSQLServerBrowserサービスに接続するには、必要なポートを開ける必要がある。
実のところこれまではデータベースサーバとしてWindowsServer2003を使っていた。2003ではファイヤーウォールは既定では無効になっていたので意識する必要がなかったのだ。
固定ポートを使用していればファイヤーウォールの設定はそのポート番号を許可させるだけでよいが動的ポートの場合にはそれができない。
そこでサービスプログラム本体(sqlserver.exe)を許可させたあと、SQLServerBrowserサービスを使ってインスタンス名からポート番号を探る必要がるので、こちらも許可させる必要がある。なお、こちらはUDPの1434番(固定)を指定するか、sqlbrowser.exeを指定する。
詳しいことは下のサイトに紹介されている。
http://www.atmarkit.co.jp/fdotnet/dotnettips/545sqlsvrnet/sqlsvrnet.html
なお、余談だが今回Access2000のデータベースをSQLServer2005Express版に移行するのにAccess2000のアップサイジングウィザードを使ったところ「オーバーフロー」のエラーが発生した。この原因を調べたところAccess2000のバグのようでOffice2000ServicePack3を当てることで正常に変換できた。
2009年01月13日
Windows7 Beta ダウンロード
http://www.microsoft.com/windows/windows-7/beta-download.aspx
http://www.microsoft.com/japan/windows/windows-7/beta-download.mspx
上記でWindow7 Beta 日本語版がダウンロードできます。
どれどれ試してみようではないか。
インストールから終了までざっと紹介。
デザインはほぼVistaと同じである。
まだ英文のままのメッセージも多い。



















http://www.microsoft.com/japan/windows/windows-7/beta-download.mspx
上記でWindow7 Beta 日本語版がダウンロードできます。
どれどれ試してみようではないか。
インストールから終了までざっと紹介。
デザインはほぼVistaと同じである。
まだ英文のままのメッセージも多い。
2008年11月13日
処理速度の改善(またはデータベースのオープンモードの注意)
5年前に作ったVB6のあるプログラムがデータ量の増大に伴い処理速度が落ちてきた。
データベースはMSDE2000(SQLServer2000相当)でADOを使っているが、適切な手続きをしていればそんなに遅くなるはずはないのに何故かと疑問に思っていた。
そのプログラムは私が作ったのではなかったが、すでに担当者は辞めていたので直すことになった。遅い箇所がどこなのかを調べるためプログラムの要所要所で時間を測る事にした。
すると、あるデータの登録時に異様に長い時間が掛かっているのが判った。たった7件のレコードを登録するのに2秒近く掛かっている。
他の箇所は数十から数百ミリ秒だから100倍以上遅い。なぜこうも時間を要するのか。
結論を言おう。
あるデータをテーブルに追加登録するのにadOpenStaticモード(静的カーソル)でオープンしていた。さらにwhere句を付けていないため、全レコード分のカーソルを取得するはめになる。これではデータが増えれば増えるほど時間が掛かる。
単純に追加登録するだけで全レコード数とか知る必要も無いのだからadOpenStaticを使う必要はない。実際にはdbOpenDynamicが効果が高いことが判った。
修正したところ10ミリ秒になった。つまり100倍以上も早くなったわけである。
調べていくとあちこちに同様の記述がある。これらを直せば相当改善されることだろう。
単純なことだが、意外と盲点で、知らず知らずやってることが結構あるんじゃないだろうか。導入当初はデータも少ないので問題に気が付かないが、データが増えていくに連れてじわじわ効果(?)が現れてくる。しかもデータが増えれば遅くなるのは当然だ、と自分を納得させてしまう。・・・・自分のことだ(^^;
データベースはMSDE2000(SQLServer2000相当)でADOを使っているが、適切な手続きをしていればそんなに遅くなるはずはないのに何故かと疑問に思っていた。
そのプログラムは私が作ったのではなかったが、すでに担当者は辞めていたので直すことになった。遅い箇所がどこなのかを調べるためプログラムの要所要所で時間を測る事にした。
すると、あるデータの登録時に異様に長い時間が掛かっているのが判った。たった7件のレコードを登録するのに2秒近く掛かっている。
他の箇所は数十から数百ミリ秒だから100倍以上遅い。なぜこうも時間を要するのか。
結論を言おう。
あるデータをテーブルに追加登録するのにadOpenStaticモード(静的カーソル)でオープンしていた。さらにwhere句を付けていないため、全レコード分のカーソルを取得するはめになる。これではデータが増えれば増えるほど時間が掛かる。
単純に追加登録するだけで全レコード数とか知る必要も無いのだからadOpenStaticを使う必要はない。実際にはdbOpenDynamicが効果が高いことが判った。
修正したところ10ミリ秒になった。つまり100倍以上も早くなったわけである。
調べていくとあちこちに同様の記述がある。これらを直せば相当改善されることだろう。
単純なことだが、意外と盲点で、知らず知らずやってることが結構あるんじゃないだろうか。導入当初はデータも少ないので問題に気が付かないが、データが増えていくに連れてじわじわ効果(?)が現れてくる。しかもデータが増えれば遅くなるのは当然だ、と自分を納得させてしまう。・・・・自分のことだ(^^;


