Сейчас на форуме: tyns777 (+5 невидимых) |
![]() |
eXeL@B —› Программирование —› Помогите Delphi и Сервисы (Службы) |
Посл.ответ | Сообщение |
|
Создано: 13 сентября 2007 08:07 · Личное сообщение · #1 Здраствуйте. Я создал сервис и инсталировал его, сервис запускается записывает в реестр данные и генерирует случайное число, нужно чтобы это число передавалось программе, но не через сокеты, как это сделать не знаю, еще нужно чтобы программа могла останавливать генерацию, тоесть сервис мог принимать сигналы от программы, вот мне хочется узнать, есть ли какиенибудь стандартные процедуры у сервиса на прием и отсылку данных? И еще мож кто знает есть ли какиенибудь сайты с описанием сервисов на русском? Делал в делфях 2007 Листинг: unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs, Registry; type TService1 = class(TService) procedure ServiceStart(Sender: TService; var Started: Boolean); procedure ServiceStop(Sender: TService; var Stopped: Boolean); procedure ServiceExecute(Sender: TService); procedure ServicePause(Sender: TService; var Paused: Boolean); procedure ServiceContinue(Sender: TService; var Continued: Boolean); private { Private declarations } public rnd: Integer; V1: Integer; function GetServiceController: TServiceController; override; { Public declarations } end; TServiceThread=class(TThread) protected procedure Execute; override; end; var Service1: TService1; SThread: TServiceThread; implementation {$R *.DFM} procedure ServiceController(CtrlCode: DWord); stdcall; begin Service1.Controller(CtrlCode); end; function TService1.GetServiceController: TServiceController; begin Result := ServiceController; end; Procedure Reestr; var Reg:TRegistry; Begin Reg:=TRegistry.Create; reg.RootKey:=HKEY_LOCAL_MACHINE; reg.OpenKey('SOFTWARE\Generator Cifr',true); if reg.ValueExists('V1') then service1.V1:=reg.ReadInteger('V1') else reg.WriteInteger('V1',60); reg.Destroy; End; procedure TServiceThread.Execute; begin randomize; FreeOnTerminate := True; while not Terminated do begin Reestr; sleep(60000 div Service1.V1); Service1.rnd:=random(100); Service1.LogMessage(inttostr(Service1.rnd)); end; end; procedure TService1.ServiceContinue(Sender: TService; var Continued: Boolean); begin SThread.Resume; Continued := True; end; procedure TService1.ServiceExecute(Sender: TService); begin while not Terminated do ServiceThread.ProcessRequests(True); end; procedure TService1.ServicePause(Sender: TService; var Paused: Boolean); begin SThread.Suspend; Paused := True; end; procedure TService1.ServiceStart(Sender: TService; var Started: Boolean); begin Reestr; SThread := TServiceThread.Create(False); Started := true; end; procedure TService1.ServiceStop(Sender: TService; var Stopped: Boolean); begin SThread.Terminate; Stopped:=true; end; end. ![]() |
|
Создано: 13 сентября 2007 08:11 · Личное сообщение · #2 |
|
Создано: 13 сентября 2007 08:22 · Личное сообщение · #3 |
|
Создано: 13 сентября 2007 08:50 · Личное сообщение · #4 |
|
Создано: 13 сентября 2007 08:58 · Личное сообщение · #5 |
|
Создано: 13 сентября 2007 09:04 · Личное сообщение · #6 |
|
Создано: 13 сентября 2007 09:06 · Личное сообщение · #7 |
|
Создано: 13 сентября 2007 10:18 · Личное сообщение · #8 |
|
Создано: 13 сентября 2007 15:12 · Личное сообщение · #9 tum0rc0re Это можно сказать для может быть будушей работы и для самообучения. Я так понимаю есть несколько способов передачи данных между процессами: атомы мэппинг файлов пайпы мейлслоты SendMessage Я буду использовать мэппинг мне кажется он самый быстрый и простой в описании программы, хотя наверно есть подводные камни, в нем. ![]() |
|
Создано: 18 сентября 2007 09:28 · Личное сообщение · #10 Кто нибудь работал с компонетой ICS (Internet component suite). Кидаю её в сервис потом делаю настройки. Далее включаю идет соединение с клиентом но только соединение и отсылка сообшения при подключении сесии и больше ничего. Общение с клиентом не происходит. Мож кто подскажет в чем ошибка. Прикрепляю исходники сервиса и ехе клиента. Вот листинг: unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs, Registry, OverbyteIcsWndControl, OverbyteIcsWSocket, TLHelp32, OverbyteIcsWSocketS, OverbyteIcsLogger; type TService1 = class(TService) WSocket: TWSocket; IcsLogger1: TIcsLogger; procedure ServiceStart(Sender: TService; var Started: Boolean); procedure ServiceStop(Sender: TService; var Stopped: Boolean); procedure ServiceExecute(Sender: TService); procedure ServicePause(Sender: TService; var Paused: Boolean); procedure ServiceContinue(Sender: TService; var Continued: Boolean); procedure WSocketSessionAvailable(Sender: TObject; ErrCode: Word); procedure WSocketDataAvailable(Sender: TObject; ErrCode: Word); procedure WSocketSocksError(Sender: TObject; Error: Integer; Msg: string); procedure ServiceCreate(Sender: TObject); procedure WSocketSocksConnected(Sender: TObject; ErrCode: Word); procedure WSocketSessionConnected(Sender: TObject; ErrCode: Word); private { Private declarations } public Procedure StartServer; function GetServiceController: TServiceController; override; { Public declarations } end; // TSockThread = class(TThread) // procedure // protected // procedure Execute; override; // end; type MyType = record Command: byte; Speed: integer; RND: integer; StopRnd:Boolean; end; var Service1: TService1; Map: THandle; Glob: pointer; SR: Mytype; aSnapshotHandle: THandle; aProcessEntry32: TProcessEntry32; implementation {$R *.DFM} procedure ServiceController(CtrlCode: DWord); stdcall; begin Service1.Controller(CtrlCode); end; function TService1.GetServiceController: TServiceController; begin Result := ServiceController; end; Procedure GetAllProc(var List: TStringList); var b: boolean; Begin List.Clear; aSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); aProcessEntry32.dwSize := SizeOf(aProcessEntry32); b := Process32First(aSnapshotHandle, aProcessEntry32); while Integer(b) <> 0 do begin list.Add(string(aProcessEntry32.szExeFile)+' '+inttostr(aProcessEntry32.th32ProcessID)); b := Process32Next(aSnapshotHandle, aProcessEntry32); end; CloseHandle(aSnapshotHandle); End; procedure TService1.StartServer; begin WSocket.Port := '3333'; WSocket.Proto := 'tcp'; WSocket.Addr := '127.0.0.1'; try WSocket.Listen; except on E:ESocketException do service1.LogMessage('Ошибка: '+e.Message,EVENTLOG_WARNING_TYPE,0,7036); end; end; procedure TService1.WSocketDataAvailable(Sender: TObject; ErrCode: Word); var buf: string[255]; List: TStringList; begin if ErrCode=0 then Begin WSocket.Receive(@Buf,sizeof(buf)); if buf='GetProcess' then begin List:=TStringList.Create; GetAllProc(List); WSocket.SendStr(List.Text); List.Destroy; end; End; end; procedure TService1.WSocketSessionAvailable(Sender: TObject; ErrCode: Word); var ss: TSocket; s:string[50]; begin if ErrCode=0 then begin ss:=WSocket.Accept; WSocket.Dup(ss); s:='Service Generator Cifr: Socket Session Available.'; //Вот это Сообщение посылается клиенту и все молчит WSocket.SendLine(s); WSocket.SendLine(s); end; end; procedure TService1.WSocketSessionConnected(Sender: TObject; ErrCode: Word); begin if ErrCode=0 then WSocket.SendLine('Service Generator Cifr: Socket Session connected.'); end; procedure TService1.WSocketSocksConnected(Sender: TObject; ErrCode: Word); begin if ErrCode=0 then WSocket.SendLine('Service Generator Cifr: Socket is connected.'); end; procedure TService1.WSocketSocksError(Sender: TObject; Error: Integer; Msg: string); begin LogMessage(Msg,EVENTLOG_WARNING_TYPE,0,7036); end; Procedure Reestr; var Reg:TRegistry; Begin Reg:=TRegistry.Create; reg.RootKey:=HKEY_LOCAL_MACHINE; reg.OpenKey('SOFTWARE\Generator Cifr',true); if reg.ValueExists('Speed') then sr.Speed:=reg.ReadInteger('Speed') else reg.WriteInteger('Speed',60); reg.Destroy; End; Procedure Send(var Global:Pointer;Buf:MyType); Begin CopyMemory(pointer(integer(global)+100),@buf,sizeof(buf)); End; Procedure Reciv(Global:Pointer;var buf:MyType); Begin CopyMemory(@buf,Global,sizeof(buf)); asm push eax mov eax,Global mov [eax],0 pop eax end; End; Procedure Init; var sa: SECURITY_ATTRIBUTES; sd: SECURITY_DESCRIPTOR; Begin InitializeSecurityDescriptor(@sd,SECURITY_DESCRIPTOR_REVISION); SetSecurityDescriptorDacl(@sd, true, nil, false); sa.lpSecurityDescriptor := @sd; sa.nLength := sizeof(SECURITY_ATTRIBUTES); sa.bInheritHandle := TRUE; map:=CreateFileMapping(INVALID_HANDLE_VALUE, @sa, PAGE_READWRITE, 0, 4096, 'GenCif'); if map=0 then service1.LogMessage('Ошибка CreateFileMapping',EVENTLOG_WARNING_TYPE,0,7036) else Begin glob:=MapViewOfFile(map,FILE_MAP_ALL_ACCESS,0,0,4096); if glob=nil then service1.LogMessage('Ошибка MapViewOfFile',EVENTLOG_WARNING_TYPE,0,7036); End; End; procedure TService1.ServiceContinue(Sender: TService; var Continued: Boolean); begin Continued := True; end; procedure TService1.ServiceCreate(Sender: TObject); begin StartServer; end; procedure TService1.ServiceExecute(Sender: TService); var buf: MyType; f:file of MyType; begin reestr; randomize; init; assignfile(f,'c:\log.txt'); rewrite(f); zeromemory(@buf,sizeof(buf)); sr.StopRnd:=false; while not Terminated do begin write(f,sr); sleep(60000 div sr.Speed); sr.Command:=1; if not sr.StopRnd then sr.RND:=random(100); Send(glob,sr); reciv(glob,buf); if buf.Command=1 then begin sr.Speed:=buf.Speed; sr.StopRnd:=buf.StopRnd; end; ServiceThread.ProcessRequests(false); end; sr.Command:=$ff; sr.Speed:=-1; sr.RND:=-1; write(f,sr); closefile(f); UnMapViewOfFile(glob); CloseHandle(map); end; procedure TService1.ServicePause(Sender: TService; var Paused: Boolean); begin Paused := True; end; procedure TService1.ServiceStart(Sender: TService; var Started: Boolean); begin Started := true; end; procedure TService1.ServiceStop(Sender: TService; var Stopped: Boolean); begin Stopped:=true; end; end. ![]() ![]() |
![]() |
eXeL@B —› Программирование —› Помогите Delphi и Сервисы (Службы) |