![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сервис [D5, D6, NT4, Win2k, WinXP]
UNLoader © (2003-01-13 17:25:00)Привет всем!
Решил на днях поразбираться с сервисами - залез на delphi.xonix.ru, там был пример. По нему я и написАл следующий код
program UNLoader;
uses Windows, WinSVC;
{$R *.RES}
var DispatchTable : array [0..1] of _SERVICE_TABLE_ENTRYA;
ServiceName: PChar;
ServiceStatus : SERVICE_STATUS;
ServiceStatusHandle : SERVICE_STATUS_HANDLE;
procedure ServiceCtrlHandler(Opcode : Cardinal);stdcall;
var
Status : Cardinal;
begin
case Opcode of
SERVICE_CONTROL_PAUSE :
begin
ServiceStatus.dwCurrentState := SERVICE_PAUSED;
end;
SERVICE_CONTROL_CONTINUE :
begin
ServiceStatus.dwCurrentState := SERVICE_RUNNING;
end;
SERVICE_CONTROL_STOP :
begin
ServiceStatus.dwWin32ExitCode:=0;
ServiceStatus.dwCurrentState := SERVICE_STOPPED;
ServiceStatus.dwCheckPoint :=0;
ServiceStatus.dwWaitHint :=0;
if not SetServiceStatus (ServiceStatusHandle,ServiceStatus)
then begin
Status:=GetLastError;
Exit;
end;
exit;
end;
SERVICE_CONTROL_INTERROGATE : ;
end;
if not SetServiceStatus (ServiceStatusHandle, ServiceStatus)
then begin
Status := GetLastError;
Exit;
end;
end;
procedure ServiceProc();stdcall;
var
Status : DWORD;
SpecificError : DWORD;
begin
ServiceStatus.dwServiceType := SERVICE_WIN32 or SERVICE_INTERACTIVE_PROCESS;
ServiceStatus.dwCurrentState := SERVICE_START_PENDING;
ServiceStatus.dwControlsAccepted := SERVICE_ACCEPT_STOP
or SERVICE_ACCEPT_PAUSE_CONTINUE;
ServiceStatus.dwWin32ExitCode := 0;
ServiceStatus.dwServiceSpecificExitCode := 0;
ServiceStatus.dwCheckPoint := 0;
ServiceStatus.dwWaitHint := 0;
ServiceStatusHandle :=
RegisterServiceCtrlHandler(ServiceName,@ServiceCtrlHandler);
ServiceStatus.dwCurrentState :=SERVICE_RUNNING;
ServiceStatus.dwCheckPoint :=0;
ServiceStatus.dwWaitHint :=0;
if not SetServiceStatus (ServiceStatusHandle,ServiceStatus)
then begin
Status:=GetLastError;
exit;
end;
// WORK HERE
end;
begin
ServiceName:= "UNLoader Service";
DispatchTable[0].lpServiceName:=ServiceName;
DispatchTable[0].lpServiceProc:=@ServiceProc;
DispatchTable[1].lpServiceName:=nil;
DispatchTable[1].lpServiceProc:=nil;
StartServiceCtrlDispatcher(DispatchTable[0]);
end.
как этот сервис взаимодействует с менеджером сервисов - понятно. Непонятно, как ему взаимодействовать например с командной строкой ?
ddenisv (2003-01-16 15:01:00) [1]Удалено модератором
Примечание: У нас не ограничивают, задать свой сообственный вопрос
ZZ (2003-01-15 03:57:00) [2]Ты лучше попробуй разобраться,а если будут проблемы - пиши сюда :)
UNLoader (2003-01-14 14:22:00) [3]а примерчик можно? а то сам боюсь не разберусь...
ZZ (2003-01-14 02:36:00) [4]Посмотри в хелпе/MSDN про Named Pipes (CreateNamedPipe и т.д.)
UNLoader (2003-01-13 18:43:00) [5]мне необходимо запускать процессы из под любого пользователя в нт. Но, как я понял, такие привилегии есть только у системы, из-под которой и запускается сервис. Допустим, я установил и запустил сервис, он уже висит у меня в списке процессов. КАК теперь, взаимодействуя с УЖЕ ЗАПУЩЕННЫМ процессом ч-з ком. строку, сделать к-л. действие?
Игорь Шевченко (2003-01-13 17:37:00) [6]Как обычно, GetCommandLine при запуске...