Сейчас на форуме: tyns777 (+5 невидимых)

 eXeL@B —› Программирование —› Помогите Delphi и Сервисы (Службы)
Посл.ответ Сообщение

Ранг: 21.8 (новичок)
Активность: 0.010
Статус: Участник

Создано: 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.



Ранг: 117.1 (ветеран)
Активность: 0.050
Статус: Участник

Создано: 13 сентября 2007 08:11
· Личное сообщение · #2

CreateFileMapping вам в помощь.

-----
Security through obscurity is just an illusion




Ранг: 26.1 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 13 сентября 2007 08:22
· Личное сообщение · #3

А почему нельзя писать это случайное число в реестр и чтобы программа оттуда его считывала, или я не правильно тебя понял.



Ранг: 21.8 (новичок)
Активность: 0.010
Статус: Участник

Создано: 13 сентября 2007 08:50
· Личное сообщение · #4

Я просто думал что в сервиса (службах) есть специальные функции для отправки данных программе и хотел использовать их, но скорее всего их нет.
Придется использовать CreateFileMapping.



Ранг: 26.1 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 13 сентября 2007 08:58
· Личное сообщение · #5

YouROK

можно еще COM-интерфейсы использовать



Ранг: 21.8 (новичок)
Активность: 0.010
Статус: Участник

Создано: 13 сентября 2007 09:04
· Личное сообщение · #6

tum0rc0re

Да следующим заданием у меня создать COM который управляет сервисом, но до него я пока не добрался.



Ранг: 26.1 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 13 сентября 2007 09:06
· Личное сообщение · #7

YouROK

Сорри за оффтоп, это по работе или учебе?




Ранг: 116.9 (ветеран)
Активность: 0.040
Статус: Участник

Создано: 13 сентября 2007 10:18
· Личное сообщение · #8

можно использовать Named pipe's, или Mailslot читай тут:
www.i2r.ru/static/565/out_16416.shtml

-----
Nothing just happens. You choose it to happen.




Ранг: 21.8 (новичок)
Активность: 0.010
Статус: Участник

Создано: 13 сентября 2007 15:12
· Личное сообщение · #9

tum0rc0re
Это можно сказать для может быть будушей работы и для самообучения.

Я так понимаю есть несколько способов передачи данных между процессами:
атомы
мэппинг файлов
пайпы
мейлслоты
SendMessage

Я буду использовать мэппинг мне кажется он самый быстрый и простой в описании программы, хотя наверно есть подводные камни, в нем.



Ранг: 21.8 (новичок)
Активность: 0.010
Статус: Участник

Создано: 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.

308a_17.09.2007_CRACKLAB.rU.tgz - Service.rar


 eXeL@B —› Программирование —› Помогите Delphi и Сервисы (Службы)
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати