如题,将一个EXE转成服务来运行,在启动服务的时候报1053错误,服务没有响应控制请求创建服务function TFWebMail.CreateServer():Boolean;
var
res: DWORD;
begin
//服务存在不继续创建服务
if isServiceExits() then begin
//开启服务
StartServer(); Result := True;
Exit;
end; Try
m_scmHandle := OpenScmHandle();//创建控制服务句柄
m_svcinfo.HscManager := m_scmHandle;
m_svcinfo.ServerName := SERVICE_NAME;
m_svcinfo.DisplayName := SERVICE_NAME;
m_svcinfo.DesireAccess := SC_MANAGER_ALL_ACCESS;
m_svcinfo.ServiceType := SERVICE_WIN32_OWN_PROCESS;
m_svcinfo.StartType := SERVICE_DEMAND_START;
m_svcinfo.ErrorControl := SERVICE_ERROR_SEVERE;
m_svcinfo.Dependencies := '';
m_svcinfo.ServerStartName := '0';
m_svcinfo.Password := '0';
m_svcinfo.BinaryPathName := m_data.m_AppPath + 'RecordServer\recordServer.exe'; //创建服务
m_svrHandle := CreateService( m_svcinfo.HscManager,//服务控制管理程序维护的登记数据库的句柄,由系统函数OpenSCManager返回
Pchar(m_svcinfo.ServerName),//以NULL 结尾的服务名,用于创建登记数据库中的关键字
Pchar(m_svcinfo.DisplayName),//以NULL 结尾的服务名,用于用户界面标识服务
m_svcinfo.DesireAccess,//指定服务返回类型
m_svcinfo.ServiceType,//指定服务类型
m_svcinfo.StartType,//指定何时启动服务
m_svcinfo.ErrorControl,//指定服务启动失败的严重程度
pchar(m_svcinfo.BinaryPathName),//指定服务程序二进制文件的路径
pchar(''),//指定顺序装入的服务组名
LPDWORD(0), //忽略,NULL
Pchar(m_svcinfo.Dependencies),//指定启动该服务前必须先启动的服务或服务组
nil,//Pchar(m_svcinfo.ServerStartName),//以NULL 结尾的字符串,指定服务帐号。如是NULL,则表示使用LocalSystem 帐号
nil//Pchar(m_svcinfo.Password)//以NULL 结尾的字符串,指定对应的口令。为NULL表示无口令。但使用LocalSystem时填NULL
); If m_svrHandle = 0 Then Begin
res := GetLastError();
ShowMessage(IntToStr(res));
Result := False;
Exit;
End;
Except
Result := False;
Exit;
End;
//启动服务
StartServer();
Result := True;end;
启动服务function TFWebMail.StartServer():Boolean;
var
sav: PAnsiChar;
serstatu: _SERVICE_STATUS;
begin
if QueryServiceStatus(m_svrHandle,serstatu) then begin if serstatu.dwCurrentState <> SERVICE_RUNNING then begin
if not StartService(m_svrHandle,0,sav) then begin
ShowMessage('启动服务失败:'+ IntToStr(GetLastError));
Result := False;
Exit;
end;
end; Result := True;
Exit;
end; Result := False;
end;
var
res: DWORD;
begin
//服务存在不继续创建服务
if isServiceExits() then begin
//开启服务
StartServer(); Result := True;
Exit;
end; Try
m_scmHandle := OpenScmHandle();//创建控制服务句柄
m_svcinfo.HscManager := m_scmHandle;
m_svcinfo.ServerName := SERVICE_NAME;
m_svcinfo.DisplayName := SERVICE_NAME;
m_svcinfo.DesireAccess := SC_MANAGER_ALL_ACCESS;
m_svcinfo.ServiceType := SERVICE_WIN32_OWN_PROCESS;
m_svcinfo.StartType := SERVICE_DEMAND_START;
m_svcinfo.ErrorControl := SERVICE_ERROR_SEVERE;
m_svcinfo.Dependencies := '';
m_svcinfo.ServerStartName := '0';
m_svcinfo.Password := '0';
m_svcinfo.BinaryPathName := m_data.m_AppPath + 'RecordServer\recordServer.exe'; //创建服务
m_svrHandle := CreateService( m_svcinfo.HscManager,//服务控制管理程序维护的登记数据库的句柄,由系统函数OpenSCManager返回
Pchar(m_svcinfo.ServerName),//以NULL 结尾的服务名,用于创建登记数据库中的关键字
Pchar(m_svcinfo.DisplayName),//以NULL 结尾的服务名,用于用户界面标识服务
m_svcinfo.DesireAccess,//指定服务返回类型
m_svcinfo.ServiceType,//指定服务类型
m_svcinfo.StartType,//指定何时启动服务
m_svcinfo.ErrorControl,//指定服务启动失败的严重程度
pchar(m_svcinfo.BinaryPathName),//指定服务程序二进制文件的路径
pchar(''),//指定顺序装入的服务组名
LPDWORD(0), //忽略,NULL
Pchar(m_svcinfo.Dependencies),//指定启动该服务前必须先启动的服务或服务组
nil,//Pchar(m_svcinfo.ServerStartName),//以NULL 结尾的字符串,指定服务帐号。如是NULL,则表示使用LocalSystem 帐号
nil//Pchar(m_svcinfo.Password)//以NULL 结尾的字符串,指定对应的口令。为NULL表示无口令。但使用LocalSystem时填NULL
); If m_svrHandle = 0 Then Begin
res := GetLastError();
ShowMessage(IntToStr(res));
Result := False;
Exit;
End;
Except
Result := False;
Exit;
End;
//启动服务
StartServer();
Result := True;end;
启动服务function TFWebMail.StartServer():Boolean;
var
sav: PAnsiChar;
serstatu: _SERVICE_STATUS;
begin
if QueryServiceStatus(m_svrHandle,serstatu) then begin if serstatu.dwCurrentState <> SERVICE_RUNNING then begin
if not StartService(m_svrHandle,0,sav) then begin
ShowMessage('启动服务失败:'+ IntToStr(GetLastError));
Result := False;
Exit;
end;
end; Result := True;
Exit;
end; Result := False;
end;
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货