Interbaseを再起動する方法
-
22-09-2019 - |
質問
フォローしようとします 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.