Форум: "WinAPI";
Текущий архив: 2005.01.30;
Скачать: [xml.tar.bz2];
ВнизУправление процессом (сервисом) Найти похожие ветки
← →
dr Tr0jan (2004-12-08 11:31) [0]Как можно управлять из одной программы другой? Т.е. я хочу сделать программу управления сервисом (не только включение/выключение, но и другие функции). Сообщения сразу отпадают - у сервиса нет формы.
← →
Rouse_ © (2004-12-08 11:36) [1]Вот тебе несколько примерчиков:
// остановка сервиса
// =============================================================================
function TfrmGSServerSetting.ServiceStop(const ServiceName: String): Boolean;
var
SCManager, Service: SC_HANDLE;
ServiceStatus: TServiceStatus;
begin
Result := IsServiceRunning(ServiceName);
if not Result then
begin
Result := True;
Exit;
end;
SCManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
if SCManager = 0 then
begin
ShowMessage(SysErrorMessage(GetLastError));
Exit;
end;
try
Service := OpenService(SCManager, PChar(ServiceName), SERVICE_STOP);
if Service = 0 then
begin
ShowMessage(SysErrorMessage(GetLastError));
Exit;
end;
try
if not ControlService(Service, SERVICE_CONTROL_STOP, ServiceStatus)
and (ServiceStatus.dwCurrentState = SERVICE_STOPPED) then
begin
ShowMessage(SysErrorMessage(GetLastError));
Exit;
end;
Result := True;
finally
CloseServiceHandle(Service);
end;
finally
CloseServiceHandle(SCManager);
end;
end;
// Проверка активности сервиса
// =============================================================================
function TfrmGSServerSetting.IsServiceRunning(const ServiceName: String): Boolean;
var
SCManager, Service: SC_HANDLE;
ServiceStatus: TServiceStatus;
begin
SCManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
if SCManager <> 0 then
try
Service := OpenService(SCManager, PChar(ServiceName), SERVICE_QUERY_STATUS);
if Service <> 0 then
try
Result := QueryServiceStatus(Service, ServiceStatus) and
(ServiceStatus.dwCurrentState = SERVICE_RUNNING);
finally
CloseServiceHandle(Service);
end
else
Result := False;
finally
CloseServiceHandle(SCManager);
end
else
Result := False;
end;
// Запуск сервиса
// =============================================================================
procedure TfrmGSServerSetting.btnStartClick(Sender: TObject);
var
SCManager, Service: SC_HANDLE;
P: PChar;
begin
if not DirectoryExists(Settings.AObject) then
if not FileExists(Settings.AObject) then
begin
MessageBox(Handle, "Укажите правильный путь к объекту.", "Ошибка...",
MB_OK or MB_ICONERROR);
Exit;
end;
SCManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
if SCManager <> 0 then
try
Service := OpenService(SCManager, "Listener", SERVICE_START);
if Service <> 0 then
try
P := nil;
if not StartService(Service, 0, P) then
begin
ShowMessage(SysErrorMessage(GetLastError));
Exit;
end;
btnStopStart.Enabled := True;
btnClose.Enabled := True;
btnStart.Enabled := False;
finally
CloseServiceHandle(Service);
end;
finally
CloseServiceHandle(SCManager);
end;
end;
// Нотификация сервиса об изменении настроек
// =============================================================================
procedure TfrmGSServerSetting.NotifyService;
var
SCManager, Service: SC_HANDLE;
ServiceStatus: TServiceStatus;
begin
SCManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
if SCManager <> 0 then
try
Service := OpenService(SCManager, "Listener", SERVICE_PAUSE_CONTINUE);
if Service <> 0 then
try
if not ControlService(Service, SERVICE_CONTROL_PARAMCHANGE, ServiceStatus) then
begin
ShowMessage(SysErrorMessage(GetLastError));
Exit;
end;
finally
CloseServiceHandle(Service);
end;
finally
CloseServiceHandle(SCManager);
end
end;
← →
dr Tr0jan (2004-12-08 12:20) [2]Первые три я знал, а за последний - респект.
← →
Digitman © (2004-12-08 12:28) [3]
> Сообщения сразу отпадают - у сервиса нет формы
а причем здесь есть форма или нет ее ?
сообщения посылаются системой трэду, а не форме
← →
dr Tr0jan (2004-12-08 13:09) [4]Ну ведь сообщения посылаются по адресу (который есть - дескриптор окна). Что такое тред?
← →
Digitman © (2004-12-08 13:40) [5]
> Ну ведь сообщения посылаются по адресу (который есть - дескриптор
> окна).
не обязательно
сообщения могут быть адресованы и непосредственно трэду
в любом случае очередь сообщений создается (по требованию) для треда, а не для окон, им создаваемых, каковых может не быть вообще или быть более чем одно
трэд же, выбирая из этой очереди сообщения, анализирует кому оно адресовано - то ли ему непосредственно, то ли какому-либо окну, им созданному, и в зависимости от этого диспетчеризует/обрабатывает эти сообщения
касаемо же отсутствия формы - формы как VCL-объекта может и не быть, но ничто не мешает в контексте трэда создать окно как ОС-объект непосредственно на WinAPI
> Что такое тред?
тред = thread, кодовый поток процесса
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2005.01.30;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.043 c