質問

フォローしようとします http://edn.embarcadero.com/article/28604 Interbase を再起動するため。以下にコードを示します。

program IBRestart;

{$APPTYPE CONSOLE}

uses
  SysUtils, winsvc;

var
  vManager, vService: SC_Handle;
  vtmp: TServiceStatus;
begin
  vManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
  if vManager > 0 then
  begin
    vService := OpenService(vManager, 'InterBaseGuardian', SERVICE_START or SERVICE_STOP);
    if vService = 0 then           // vService is always 0 here, why ?
      CloseServiceHandle(vManager)
    else
    if ControlService(vService, SERVICE_CONTROL_STOP, vTmp) and
       QueryServiceStatus(vService, vTmp) and
       (vTmp.dwCurrentState = SERVICE_STOPPED) then
    begin
      WriteLn('Success');
    end;
  end;
end.

サービス ダイアログにサービスが「InterBase 2009 Guardian gds_db」としてリストされていることがわかります。OpenService への引数としてこれのさまざまなバリアントを試しましたが、成功しませんでした...何かヒントはありますか?

編集:ネットスタートリストとしてサービスをリストします InterBase 2009 ガーディアン gds_db そして InterBase 2009 サーバー gds_db

RaiseLastOSError はどちらの場合でもこれを返します。プロジェクト IBRestart.exe は、「システム エラー」というメッセージを含む例外クラス EOSError を発生させました。コード:1060。指定されたサービスはインストールされたサービスとして存在しません。」

したがって、上記のコードでは vService は常に 0 になります。テーマのような別のサービスを停止しようとしても、実際に機能します。特別に処理する必要があるのは文字列内のスペースでしょうか?閉じようとした IIS管理者 そして、Interbase と同じエラー メッセージが返されました。

役に立ちましたか?

解決

これは InterBase 2007 を再起動するために使用するバッチ ファイルです。 一部のマシンではサービス名に余分なスペースが含まれていることがわかります。:

rem jpl: 20071015 - on some machines, the guardian service has an extra space
net stop "InterBase 2007 Guardian gds_db"
net stop "InterBase 2007 Guardian gds_db "
net stop "InterBase 2007 Server gds_db"
net start "InterBase 2007 Guardian gds_db"
net start "InterBase 2007 Guardian gds_db "
pause

Guardian を 2 回停止して起動していることに注意してください。サービスの停止/開始のタイムアウト時間内に反応しない場合があります。また、InterBase サービスも具体的に停止します。ほとんど必要ありませんが、ガーディアン サービスは停止したことがありましたが、InterBase サービスは停止しませんでした。

--ジェローン

他のヒント

たぶん、サービス名は、間違っているか、(管理者として起動する必要が)十分な権限を持っていないのですか?ハードゴーン間違って持っているものへの任意のヒントなしで教えてます。

コールのいずれかがエラー(戻りコード= 0)信号かどうかをチェックし、エラーがその場合にRaiseLastOSError又はSysErrorMessage(GetLastError関数)を呼び出すことによるものであるかどうか確認してください。また、他の呼び出しでエラーをチェックしてください。あなたの質問をもたらす任意の新しい情報で更新してください。

そして> 0の<> 0 0信号のエラーから小切手、何かの成功を変更します。ハンドルは、負の数とすることができます。そして、いくつかのtry..finallyを追加します。そして再びサービスを開始するためのコードを忘れないでください:)サービスがのControlServiceを呼び出した後の状態を変更する前にQueryServiceStatusが実際に停止する前にしばらくの間、SERVICE_STOP_PENDINGを返す場合がありますので、また、それはしばらく時間がかかるかもしれません。あなたのコードは、それを考慮する必要があります。例えばをここにを参照してください。

program IBRestart;

{$APPTYPE CONSOLE}

uses
  SysUtils, winsvc;

var
  vManager, vService: SC_Handle;
  vtmp: TServiceStatus;
begin
  vManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
  if vManager <> 0 then
  begin
    try
      vService := OpenService(vManager, 'InterBaseGuardian', SERVICE_START or SERVICE_STOP);
      if vService = 0 then      // vService is always 0 here, why ?
        RaiseLastOSError;       // This will give a hint why !
      else
        try
          Win32Check(ControlService(vService, SERVICE_CONTROL_STOP, vTmp));
          Win32Check(QueryServiceStatus(vService, vTmp));
          if vTmp.dwCurrentState = SERVICE_STOPPED then   // This might also be SERVICE_STOP_PENDING
            WriteLn('Success')
          else
            WriteLn('Failure');
        finally
          CloseServiceHandle(vService);
        end;
    finally
      CloseServiceHandle(vManager);
    end;
  end
  else
    RaiseLastOSError;
end.
scroll top