2009年06月06日

サービスプログラムのデバッグ方法(Visual Studio 2005)

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

posted by なっちゃん at 11:19| 静岡 雨| Comment(0) | TrackBack(0) | VB.NET Tips | このブログの読者になる | 更新情報をチェックする

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側で使うとホスト側から使用できなくなるのは改善して欲しい。
posted by なっちゃん at 17:56| 静岡 雨| Comment(0) | TrackBack(1) | ETC | このブログの読者になる | 更新情報をチェックする

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
これについては次回に解説する。

windows7-rc-1
windows7-rc-2
windows7-rc-3
windows7-rc-4
posted by なっちゃん at 14:58| 静岡 雨| Comment(0) | TrackBack(0) | ETC | このブログの読者になる | 更新情報をチェックする

2009年04月21日

VB2005(VB.NET)のNotifyIconからのフォーム表示の問題点

タスクトレイにアイコンを表示させる時、VB6の時はかなり面倒な処理をする必要があったが、VB.NETではNotifyIconコントロールという大変便利なものがある。

今回これを使ったプログラムを作っていて問題が見つかった。
それは、タスクトレイに表示されたアイコンをクリックしてフォームを開くとき、そのままではアクティブになっていないのである。

たとえば、パスワードを入力させるためにパスワード用フォームを開いてもキー入力を受け付けないのである。一回フォームをクリックしてアクティブにしてからでないとキー入力できないというのでは使い勝手が悪い。これが別のフォーム上のButtonコントロールから開くときにはちゃんとアクティブになっているのだから始末が悪い。

何とかアクティブにならないかと悪戦苦闘してみたが100%確実にアクティブにする方法が見つからない。

ところがやっと見つかった解決策は実に単純だった。
フォームのLoadイベントのなかで、Me.Activate() と一行追加するだけで解決した。
やれやれ(^^;
posted by なっちゃん at 12:53| 静岡 雨| Comment(0) | TrackBack(0) | VB.NET Tips | このブログの読者になる | 更新情報をチェックする

2009年04月15日

アプリケーション情報(VB6とVB2005)

アプリ情報VB6VB2005
実行パスApp.PathMy.Application.Info.DirectoryPath
実行ファイル名
(拡張子を除く)
App.EXENameMy.Application.Info.AssemblyName
メジャー番号App.MajorMy.Application.Info.Version.Major
マイナー番号App.MinorMy.Application.Info.Version.Minor
ビルド番号(該当無し)My.Application.Info.Version.Build
リビジョン番号App.RevisionMy.Application.Info.Version.Revision
バージョンの構成(Major.Minor.0.Revision)(Major.Minor.Build.Revision)
タイトルApp.TitleMy.Application.Info.Title
ファイルの説明App.FileDescription
会社名App.CompanyNameMy.Application.Info.CompanyName
コメントApp.CommentsMy.Application.Info.Description
ヘルプファイル名App.HelpFile(該当無し)
著作権情報App.LegalCopyrightMy.Application.Info.Copyright
商標App.LegalTrademarksMy.Application.Info.Trademark

※バージョン情報については、こちらも参考に→「自アプリケーションのバージョンを取得
posted by なっちゃん at 14:27| 静岡 雨| Comment(0) | TrackBack(0) | VB vs VB.NET | このブログの読者になる | 更新情報をチェックする

2009年03月27日

デフォルトボタンの指定方法

VB6では、Enterキーを押すと自動で応答するボタンをDefaultプロパティをTrueにすることで指定できた。
VB.NET(2005,2008含)になってその方法が変わり、フォームのAcceptButtonプロパティでボタンの名前を指定する。

VB6:
Private Sub Text1_Change()
If Text1.Text = "" Then
Command1.Default = False
Else
Command1.Default = True
End If
End Sub
VB6のサンプル画面
vb6:default=false vb6:default=true

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
VB2008のサンプル画面
vb.net:AcceptButton=Nothing VB.NET:AcceptButton=Button1

同様にESCキーに応答させるVB6のボタンのCancelプロパティは、VB.NETではフォームのCancelButtonプロパティになる。
posted by なっちゃん at 11:34| 静岡 曇り| Comment(0) | TrackBack(0) | VB vs VB.NET | このブログの読者になる | 更新情報をチェックする

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を当てることで正常に変換できた。
posted by なっちゃん at 17:22| 静岡 曇り| Comment(0) | TrackBack(0) | ETC | このブログの読者になる | 更新情報をチェックする

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と同じである。
まだ英文のままのメッセージも多い。

090113172110.gif

090113172148.gif

090113172202.gif

090113172215.gif

090113172234.gif

090113172251.gif

090113172304.gif

090113174357.gif

090113174703.gif

090113174721.gif

090113174838.gif

090113175043.gif

090113175305.gif

090113175650.gif

090113180041.gif

090113180206.gif

090113181858.gif

090113182550.gif

090113183351.gif
posted by なっちゃん at 16:59| 静岡 曇り| Comment(0) | TrackBack(0) | ETC | このブログの読者になる | 更新情報をチェックする

2008年11月13日

処理速度の改善(またはデータベースのオープンモードの注意)

5年前に作ったVB6のあるプログラムがデータ量の増大に伴い処理速度が落ちてきた。
データベースはMSDE2000(SQLServer2000相当)でADOを使っているが、適切な手続きをしていればそんなに遅くなるはずはないのに何故かと疑問に思っていた。

そのプログラムは私が作ったのではなかったが、すでに担当者は辞めていたので直すことになった。遅い箇所がどこなのかを調べるためプログラムの要所要所で時間を測る事にした。
すると、あるデータの登録時に異様に長い時間が掛かっているのが判った。たった7件のレコードを登録するのに2秒近く掛かっている。
他の箇所は数十から数百ミリ秒だから100倍以上遅い。なぜこうも時間を要するのか。

結論を言おう。
あるデータをテーブルに追加登録するのにadOpenStaticモード(静的カーソル)でオープンしていた。さらにwhere句を付けていないため、全レコード分のカーソルを取得するはめになる。これではデータが増えれば増えるほど時間が掛かる。
単純に追加登録するだけで全レコード数とか知る必要も無いのだからadOpenStaticを使う必要はない。実際にはdbOpenDynamicが効果が高いことが判った。
修正したところ10ミリ秒になった。つまり100倍以上も早くなったわけである。
調べていくとあちこちに同様の記述がある。これらを直せば相当改善されることだろう。

単純なことだが、意外と盲点で、知らず知らずやってることが結構あるんじゃないだろうか。導入当初はデータも少ないので問題に気が付かないが、データが増えていくに連れてじわじわ効果(?)が現れてくる。しかもデータが増えれば遅くなるのは当然だ、と自分を納得させてしまう。・・・・自分のことだ(^^;
posted by なっちゃん at 17:15| 静岡 曇り| Comment(0) | TrackBack(0) | VB Tips | このブログの読者になる | 更新情報をチェックする

2008年10月27日

ログオン後に自動起動させる方法で一番早いのはどれか?

Windowsにログオンしたあとプログラムを自動で起動させるには3つの方法がある。
・スタートアップに登録する方法
・レジストリ(CURRENT_USER)に登録する方法
・レジストリ(LOCAL_MACHINE)に登録する方法

さて、このうちどれが一番早く起動するだろうか。

実は今まであまり気にして無かったのでテストしてみることにした。
次のバッチファイルをそれぞれに登録してみた。

@echo off
echo これは○○○○
time

その結果は下のようになった。
起動した順番

1番:LOCAL_MACHINE
2番:CURRENT_USER
3番:スタートアップ

案外予想通りだったなぁ。
posted by なっちゃん at 18:13| 静岡 晴れ| Comment(0) | TrackBack(0) | ETC | このブログの読者になる | 更新情報をチェックする