4

Interbase の再起動については、 http: //edn.embarcadero.com/article/28604に従ってください。ここにいくつかのコードがあります:

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 の引数としてこれのさまざまなバリエーションを試しましたが、成功しませんでした...ヒントはありますか?

編集: net start サービスをInterBase 2009 Guardian gds_dbおよびInterBase 2009 Server gds_dbとしてリストします。

RaiseLastOSError はどちらの場合もこれを返します。コード: 1060。指定されたサービスは、インストールされたサービスとして存在しません。

したがって、上記のコードでは、vService は常に 0 です。Themes などの別のサービスを停止しようとしても、実際に機能します。特別に処理しなければならないのは、文字列内のスペースですか? IIS Adminを閉じようとしましたが、Interbase と同じエラー メッセージが返されました。

4

3 に答える 3

4

サービス名が間違っているか、十分な権限がない (管理者として開始する必要がある) 可能性がありますか? 何がうまくいかなかったのかについてのヒントがなければ、見分けるのは困難です。

いずれかの呼び出しがエラー (リターン コード = 0) を通知するかどうかを確認し、その場合は RaiseLastOSError または SysErrorMessage(GetLastError) を呼び出してエラーの内容を確認してください。また、他の呼び出しでエラーがないか確認してください。新しい情報があれば、質問を更新してください。

チェックを > 0 から <> 0 に変更します。0 はエラーを示し、それ以外は成功を示します。ハンドルは負の数にすることができます。そして、try..finally を追加します。また、サービスを再度開始するためのコードを忘れないでください :) また、ControlService の呼び出し後にサービスの状態が変わるまでに時間がかかる場合があるため、実際に停止する前に QueryServiceStatus がしばらくの間 S​​ERVICE_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.
于 2010-01-03T20:48:28.343 に答える
2

Guardianは、Ibserver.exe がダウンしたときに再起動するサービスです。古い OS や、ibserver をアプリケーションとして実行する場合に役立ちました。Ibserver をサービスとして使用する場合、これをサービスで直接管理できます (この場合、Guardian は役に立ちません)。

于 2010-01-03T22:27:56.307 に答える
2

これは、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

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

--jeroen

于 2010-01-04T10:14:04.173 に答える