1

歴史

更新とサーバー機能を処理するためにWindows Serviceの一部として を構築しているため、 がインストールされている場所とは異なるマシンにインストールできます。UDP を使用してブロードキャスト メッセージを送受信し、TCP を使用してより機密性の高い最も重要なメッセージを処理します。Platform ApplicationClient Application

目的

実行可能ファイルをコンピューターにコピーして実行するだけで、エンドユーザーがアプリケーションを簡単にインストールできるようにしたいと考えています。メインアプリケーションは、ユーザーが管理者であるかどうかを確認し、構成ファイルを作成してから、Windows サービスをインストールして実行する必要があります。これにより、管理者以外のユーザーがログインしたときに、管理者権限に関するアプリケーションからのエラーが発生しなくなります。データベースがリモートになるため、現在の技術者を必要とせずにほとんどの構成を行うことが目標です。

問題

私のサービスはコマンドで正常にインストールされていますが、MyService.exe /install自動的に開始されません。それを開始する唯一の方法は、続行しControl Panel > Admin Tools > Servicesて手動で行うことです。アプリケーションから呼び出そうとしましたが、シェルでnet start MyService受信しました。サービスの、、invalid service nameを試しましたが、どれも機能しませんでした。これは私の TService のオブジェクトです:executable namedisplay nameobject name

object ServiceMainController: TServiceMainController
  OldCreateOrder = False
  OnCreate = ServiceCreate
  DisplayName = 'PlatformUpdateService'
  Interactive = True
  AfterInstall = ServiceAfterInstall
  AfterUninstall = ServiceAfterUninstall
  OnShutdown = ServiceShutdown
  OnStart = ServiceStart
  OnStop = ServiceStop
  Height = 210
  Width = 320 

質問

ユーザーの手ではなくコードでサービスを開始するにはどうすればよいですか? OnServiceAfterInstallクライアントアプリケーション内で、または呼び出し後に単独で実行できれば最高です。

4

1 に答える 1

7

イベントでのサンプルStartService呼び出しは次のとおりです。AfterInstall

procedure TServiceMainController.ServiceAfterInstall(Sender: TService);
var
  Manager, Service: SC_HANDLE;
begin
  Manager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
  Win32Check(Manager <> 0);
  try
    Service := OpenService(Manager, PChar(Name), SERVICE_ALL_ACCESS);
    Win32Check(Service <> 0);
    try
      Win32Check(StartService(Service, 0, PChar(nil^)));
    finally
      CloseServiceHandle(Service);
    end;
  finally
    CloseServiceHandle(Manager);
  end;
end;

ただし、通常は成功するはずなので、うまくいくかどうかはわかりませnet startん。

于 2013-08-20T00:29:05.210 に答える