サービスの起動時に引数を入れたい〜VS2015

  • 2015.09.24 Thursday
  • 18:49

先日VS2015のサービスプログラムのインストールについて書いたが、

VS2015に限らないとは思うが、
サービスの起動時に引数を入れて起動させたいと思ったりすることが希にある。


まず、サービスから直で起動する場合は、
サービスの開始パラメーターに入れて上げればよいのだが、
あくまで手動で開始する場合に限ってであるため、
閉じるとパラメーターは空欄になり、自動起動では反映されない。

サービス 引数

では、引数を強制的に入れ込むにはどうしたらいいのかと検索してみると、

ServiceBase.OnStart メソッド

に、レジストリに直書きする方法が書いてあった。
下に追記しましたが、コマンドから追加するのが正しいやり方です。
レジストリをいじるとOSが起動しなくなることがありますので、コマンドから行うようにしてください。


例えば、前回インストールしたサービスなら、レジストリの

HKEY_LOCAL_MACHINE¥SYSTEM¥CurrentControlSet¥Services¥テストサービス2015
※¥は半角

を探して、その中の ImagePath に
 
D:¥test¥program¥TestProgram2015¥TestSetUp2015.exe arg1 arg2 arg3
※¥は半角

という感じで、プログラムのパスの後に半角スペース+引数
という感じで指定してあげれば良いようである。

サービス 引数


しかし、インストールするたびにこれを毎回書き換えるのは面倒である。
しかも、レジストリをいじるとOSが起動しなくなって危険である。
※下にコマンドで追加する方法を追記しました。


ということで、InstallShieldの機能を使って見ることにした。

とりあえず、前の投稿にしたがってゴリゴリセットアップを作って、
サービスのところにある Start Parameters に引数を書けばOK

サービス 引数

あとは、インストールすれば自動で登録してくれる。

サービス 引数

ちなみに、VS2008のセットアップはProjectInstallerを自作すれば良さそうな感じであるが、
他力ちゃんで今回は省略する

参考URL
【.NET】Installerを継承してWindowsサービスをインストールする際に引数を指定。


で、ここからが問題で、普通に
 
Protected Overrides Sub OnStart(ByVal args() As String)
‌ 
If args.Length > 0Then
Call WriteLog(String.Format("引数({0}) = {1}", args.Length, String.Join(" ", args)))
Else
Call WriteLog("引数なし")
End If

という感じでソースを書いて開始しても、
なぜか 引数なし になってしまう。

もう一度

ServiceBase.OnStart メソッド

を読むと、
 
レジストリの引数は、GetCommandLineArgs メソッドを使用して取得できます。
たとえば、string[] imagePathArgs = Environment.GetCommandLineArgs(); のようにします。

と書いてある。

つまり、レジストリからの引数はargsには入ってこないようだ。
※あくまで開始コマンド

試しに、書かれているEnvironment.GetCommandLineArgsを追加して上げると、
 
Protected Overrides Sub OnStart(ByVal args() As String)
‌ 
    args = Environment.GetCommandLineArgs
‌ 
    If args.Length > 0Then
        Call WriteLog(String.Format("引数({0}) = {1}", args.Length, String.Join(" ", args)))
    Else
        Call WriteLog("引数なし")
    End If
 
引数(4) = D:¥test¥program¥TestProgram2015¥TestSetUp2015.exe arg1 arg2 arg3

といった具合に プログラムのパス + 設定した引数 で入ってくる。


 
追記160223
レジストリをいじると誤ってOSが起動しなくなることがあるので、
コマンドライン(SCコマンド)から設定するというのがよい

SCのリファレンスはこちら

上の例でサービスを登録するなら、
 
sc create テストサービス2015 binPath= "D:¥test¥program¥TestProgram2015¥TestSetUp2015.exe arg1 arg2 arg3"
※¥は半角

という感じになる。

既に登録されたサービスに引数を追加する場合は、configコマンドを使って
 
sc config テストサービス2015 binPath= "D:¥test¥program¥TestProgram2015¥TestSetUp2015.exe arg1 arg2 arg3"
※¥は半角

とすれば、引数を追加できる。

 
コメント
コメントする








    
この記事のトラックバックURL
トラックバック

calendar

S M T W T F S
    123
45678910
11121314151617
18192021222324
25262728293031
<< August 2019 >>

search this site.

よく使う、検索される投稿

categories

■Google AD■

アマゾン

楽天

selected entries

archives

recent comment

  • ブレークポイントは現在の設定ではヒットしません〜ソリューションのデバッグ
    B.T (08/09)
  • 山の白い看板
    rockecco (06/06)
  • 山の白い看板
    田舎人 (05/08)
  • あの、クラスとかメソッドとかプルダウンできるバーって〜Visual Studio 2015
    rockecco (04/27)
  • あの、クラスとかメソッドとかプルダウンできるバーって〜Visual Studio 2015
    NS (04/27)
  • MacでBlu-ray編 〜 BD-Rを焼く その3 サポセン編
    rockecco (04/23)
  • Shurikenで添付ファイルまとめて保存したい
    rockecco (04/23)
  • MacでBlu-ray編 〜 BD-Rを焼く その3 サポセン編
    たかなママ (04/22)
  • Shurikenで添付ファイルまとめて保存したい
    aa (04/18)
  • Windows7のエクスプローラのお気に入りが登録されなくなった
    rockecco (04/09)

recent trackback

profile


※当ブログはリンクフリーですが、 取材や雑誌等で掲載される場合は、事前にお知らせください

others

mobile

qrcode

powered

無料ブログ作成サービス JUGEM