2013-09-03 24 views
8

私はDelphiでWindowsサービスを作成し、インストール、開始、停止の2つの方法を使用しました。サービスが開始しない

方法1

私はコマンドライン

C:\MyService\ServiceApp.exe /Install 

を使用してこのサービスをインストールした場合、それは正常にインストールされ、私が起動し、サービスコンソールで、あまりにも停止することができます。

方法2

私はSCを使用して別の名前で同一のサービスをインストールする場合 例えば

C:\Windows\system32>sc query myservice 

SERVICE_NAME: myservice 
     TYPE    : 10 WIN32_OWN_PROCESS 
     STATE    : 2 START_PENDING 
           (NOT_STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN) 
     WIN32_EXIT_CODE : 0 (0x0) 
     SERVICE_EXIT_CODE : 0 (0x0) 
     CHECKPOINT   : 0x0 
     WAIT_HINT   : 0x7d0 
を次のように

C:\Windows\system32>sc create myservice binpath= c:\MyService\ServiceApp.exe 

私はそれがインストールされて表示されますが、私はSC、結果を使用してクエリを実行するとき、私は

sc start myservice 

でサービスコンソールと同様に を使用してサービスを開始することはできませんです

まで私は/ Installを使っていましたが、同じサービスを別の名前で何度もインストールしたいのですが、私はこの投稿からこのアイデアを得ました。 (How to install a windows service from command line specifying name and description?) 誰でも/ InstallとSCの動作の違いを説明できますか?

+0

あなたがインストールしたコードを表示し、それを起動するコードを表示できる場合は、お手伝いできます。 –

+1

インストールする: sc作成myservice binpath = c:\ serviceapp \ ServiceApp.exe 開始: sc start myserviceまたは単にサービスコンソールから起動 – Girish

+0

質問はこの重要な情報を含めるように編集してください。 –

答えて

13

TServiceの実装でバグが発生しました。QC#79781を参照してください。サービス名がTService.Nameと異なる場合、Delphiはサービスを開始できません。

ただし、サービスが開始される前にTService.Nameを調整することで、この制限を回避できます。これを行う良い点の1つは、TService.OnCreateイベントです。サービスの実際の名前を知る必要があるので、サービスexeの引数として渡す必要があります(sc createコマンドのbinpathに追加する必要があります)。

は、サービスを作成します。

sc create myservice1 binpath= "c:\MyService\ServiceApp.exe myservice1" 
sc create myservice2 binpath= "c:\MyService\ServiceApp.exe myservice2" 

は名前を調整します。

procedure TMyService.ServiceCreate(Sender: TObject); 
begin 
    if (System.ParamCount >= 1) and not CharInSet(ParamStr(1)[1], SwitchChars) then 
    Name := ParamStr(1); 
end; 

これは、引数の解析のやや初歩的な方法であるが、それは一例としてokです。最初の引数が/または-で始まらない場合は、指定された名前であるとみなされます。

備考:

TServiceの別の制限は、それがbinpathとしてParamStr(0)を使用しているため、それは、そのコマンドラインの引数を持つ(/installを使用して)サービスを作成することができないということです。

+1

よくできました!本当の名前で使用したときにSCがサービスを開始できる理由を理解しようとしていました。 –

+2

@Sertac:このバグは、Delphiが1つのexeで複数の 'TService 'を共有できるようにするために使用されるシステムによるものです。 TServiceが1つしかない場合、単純な解決策は 'Name'をチェックしないことです。 – JRL

関連する問題