gpt4 book ai didi

delphi - 如何重新启动 Interbase

转载 作者:行者123 更新时间:2023-12-03 15:22:47 25 4
gpt4 key购买 nike

我尝试关注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 的参数,但没有成功......有任何提示吗?

编辑:net start 将服务列为 InterBase 2009 Guardian gds_dbInterBase 2009 Server gds_db

RaiseLastOSError 在两种情况下都会返回此信息:项目 IBRestart.exe 引发了异常类 EOSError,并显示消息“系统错误”。代码:1060。指定的服务不作为已安装的服务存在。

所以上面代码中的 vService 始终为 0。我什至尝试停止其他服务,例如主题,它确实有效。难道是字符串中的空格需要特殊处理吗?我尝试关闭 IIS Admin,但它返回了与 Interbase 相同的错误消息。

最佳答案

也许服务名称错误或者您没有足够的权限(需要以管理员身份启动)?如果没有任何迹象表明出了什么问题,很难说清楚。

请检查是否有任何调用发出错误信号(返回代码 = 0),并在这种情况下通过调用 RaiseLastOSError 或 SysErrorMessage(GetLastError) 来检查错误是什么。还要确保检查其他调用是否有错误。请使用带来的任何新信息更新您的问题。

并将检查从 > 0 更改为 <> 0。0 表示错误,其他表示成功。句柄可以是负数。最后添加一些尝试。并且不要忘记再次启动服务的代码:) 此外,在调用 ControlService 之后,服务可能需要一段时间才能更改状态,因此 QueryServiceStatus 可能会在实际停止之前返回 SERVICE_STOP_PENDING 一段时间。你的代码应该考虑到它。请参阅here举个例子。

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.

关于delphi - 如何重新启动 Interbase,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1996209/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com