Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблема с написанием Service'а [D7, WinXP]


Страницы:   1 2

patrick1968 ©   (2008-02-11 17:24:00) 

Появилась такая задача, решить которую надумал при помощи сервиса (до этого с этим не сталкивался), тема простая в случае появления определенного файла в определенном месте его необходимо перекинуть в др. место (наверное всё просто да только не работает) вот код:

unit Unload1;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs, ActiveX, IniFiles,
 DB, ADODB;

type
 TUnload = class(TService)
   OraConnection: TADOConnection;
   procedure ServiceExecute(Sender: TService);
   procedure ServiceStart(Sender: TService; var Started: Boolean);
 private
   { Private declarations }
 public
   QDesk : integer;
   TempPath, arrPath, ConnectStringIn, ConnectStringOut : string;
   arrDesk : array of string;
   function GetServiceController: TServiceController; override;
   { Public declarations }
 end;

var
 Unload: TUnload;

implementation

{$R *.DFM}

procedure ServiceController(CtrlCode: DWord); stdcall;
begin
 Unload.Controller(CtrlCode);
end;

function TUnload.GetServiceController: TServiceController;
begin
 Result := ServiceController;
end;

procedure TUnload.ServiceExecute(Sender: TService);
begin
 CoInitialize(nil);
 while not terminated do begin
              FileCreate(arrDesk[0] + 'cash001s.db');
    if FileExists(arrDesk[0] + 'cash001.db')
       then begin
              FileCreate(arrDesk[0] + 'cash001s.db');
              MoveFile(PChar(arrDesk[0] + 'cash001.db'),PChar(TempPath + 'cash001.db'));
       end;
    serviceThread.ProcessRequests(false);
    CoUnInitialize;
 end;
end;

procedure TUnload.ServiceStart(Sender: TService; var Started: Boolean);
var UnloadIni : TIniFile;
    ind, idx : integer;
begin
 CoInitialize(nil);

 UnloadIni := TIniFile.Create('prUnload.ini');
 if not FileExists('prUnload.ini')
    then begin
          UnloadIni.WriteInteger( 'MAIN', 'QDESK', 1);
          UnloadIni.WriteString( 'MAIN', 'TEMPPATH', 'C:\');
          UnloadIni.WriteString( 'MAIN', 'ARRPATH', '');
          UnloadIni.WriteString( 'MAIN', 'CONNECTSTRING_IN', '');
          UnloadIni.WriteString( 'MAIN', 'CONNECTSTRING_OUT', '');
          QDesk := UnloadIni.ReadInteger( 'MAIN', 'QDESK', 1);
          TempPath := UnloadIni.ReadString( 'MAIN', 'TEMPPATH', '');
          ArrPath := UnloadIni.ReadString( 'MAIN', 'ARRPATH', '');
          ConnectStringIn := UnloadIni.ReadString( 'MAIN', 'CONNECTSTRING_IN', '');
          ConnectStringOut := UnloadIni.ReadString( 'MAIN', 'CONNECTSTRING_OUT', '');
         end
       else begin
             QDesk := UnloadIni.ReadInteger( 'MAIN', 'QDESK', 1);
             TempPath := UnloadIni.ReadString( 'MAIN', 'TEMPPATH', '');
             ArrPath := UnloadIni.ReadString( 'MAIN', 'ARRPATH', '');
             ConnectStringIn := UnloadIni.ReadString( 'MAIN', 'CONNECTSTRING_IN', '');
             ConnectStringOut := UnloadIni.ReadString( 'MAIN', 'CONNECTSTRING_OUT', '');
            end;
 UnloadIni.Free;

 try
  OraConnection.ConnectionString := ConnectStringIn;
  OraConnection.Connected := true;
 except
 end;

 SetLength( arrDesk, QDesk);
 ind := 0;
 idx := 1;
 arrDesk[ind] := '';
 while (idx <= Length(arrPath)) do begin
    if arrPath[idx] <> ','
      then arrDesk[ind] := arrDesk[ind] + arrPath[idx]
      else begin
            inc(ind);
            arrDesk[ind] := '';
           end;
    inc(idx);
 end;

 CoUnInitialize;

end;


в стартовой процедуре определил переменные, которые нужны при Execute'е, только там она их не видит почему-то, помогите разобраться, заранее благодарен.


Сергей М.   (2008-02-12 15:35:00) [1]


> в случае появления определенного файла в определенном месте
> его необходимо перекинуть в др. место


Логика, ведущая в тупик.


ketmar   (2008-02-12 15:33:00) [2]

>[33] Palladin © (2008-02-12 15:27:00)
вообще-то жрачки. %-)

---
Understanding is not required. Only obedience.


Leonid Troyanovsky   (2008-02-12 15:28:00) [3]


> Slym ©   (12.02.08 13:35) [25]

> Откуда эти мертвяки лезут?

Из вредных советов.
http://podgoretsky.com/DM/BadTips.html#bt-04

--
Regards, LVT.


Palladin   (2008-02-12 15:27:00) [4]


> [32] ketmar ©   (12.02.08 15:11)

w3k ждал? :)


ketmar   (2008-02-12 15:11:00) [5]

>[31] Dennis I. Komarov © (2008-02-12 15:09:00)
>Злой ты какой-то сегодня :)

не спал ещё. %-)

---
Understanding is not required. Only obedience.


Dennis I. Komarov   (2008-02-12 15:09:00) [6]

> [29] ketmar ©   (12.02.08 14:02)

Злой ты какой-то сегодня :)


> [27] patrick1968 ©   (12.02.08 13:47)

Переходим к убитым енотам: 50


Palladin   (2008-02-12 14:10:00) [7]


> [27] patrick1968 ©   (12.02.08 13:47)

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


ketmar   (2008-02-12 14:02:00) [8]

>[23] Palladin © (2008-02-12 13:31:00)
как это «где-то»? очен даже известно, где. некий неприкасаемый это популяризировал, чтоб ему ни дна, ни покрышки.

---
Understanding is not required. Only obedience.


Slym   (2008-02-12 13:56:00) [9]

var
 UnloadIni : TIniFile;
begin
 UnloadIni := TIniFile.Create('prUnload.ini');
 try
   if not FileExists(UnloadIni.FileName) then
   begin
     UnloadIni.WriteInteger( 'MAIN', 'QDESK', 1);
     UnloadIni.WriteString( 'MAIN', 'TEMPPATH', 'C:\');
     UnloadIni.WriteString( 'MAIN', 'ARRPATH', '');
     UnloadIni.WriteString( 'MAIN', 'CONNECTSTRING_IN', '');
     UnloadIni.WriteString( 'MAIN', 'CONNECTSTRING_OUT', '');
   end;
   QDesk := UnloadIni.ReadInteger( 'MAIN', 'QDESK', 1);
   TempPath := UnloadIni.ReadString( 'MAIN', 'TEMPPATH', '');
   ArrPath := UnloadIni.ReadString( 'MAIN', 'ARRPATH', '');
   ConnectStringIn := UnloadIni.ReadString( 'MAIN', 'CONNECTSTRING_IN', '');
   ConnectStringOut := UnloadIni.ReadString( 'MAIN', 'CONNECTSTRING_OUT', '');
 finally
   UnloadIni.Free;
 end;


patrick1968   (2008-02-12 13:47:00) [10]

Да все эти выкрутасы с этих ссылок и взял, из примеров


Slym   (2008-02-12 13:37:00) [11]

и OraConnection у тебя для понта или реально гдето используется?


Slym   (2008-02-12 13:35:00) [12]

   while not Terminated do
   begin
        Synchronize(DoWork);
       Sleep(1000);
   end;

Откуда эти мертвяки лезут? А выкрутасы с ini на елку вместо гирлянд весить...
сделай модуть (unit) со своим потоком... отладь его в обычном приложении... а уж потом его к сервису приленкуешь


Palladin   (2008-02-12 13:33:00) [13]


> Self.Priority := tpHighest;

а за это вообще пожизненный эцих с гвоздями


Palladin   (2008-02-12 13:31:00) [14]


> procedure TMainThread.Execute;
> begin
>     while not Terminated do
>     begin
>         Synchronize(DoWork);
>         Sleep(1000);
>     end;
> end;

ты опять бредишь?
и по ссылке мы не ходили по моей
и гдето про synchronize узнали
и решили что это круто
и заюзали


Сергей М.   (2008-02-12 13:31:00) [15]


> переменные которые фигурируют в конструкторе


> в процедуре DoWork


Какой такой "конструктор" ? Какая DoWork ?!
Ни того ни другого в приведенном коде и в помине нет


patrick1968   (2008-02-12 13:28:00) [16]

Так сделал, служба стартует нормально только переменные которые фигурируют в конструкторе (например arrDesk[0] которая на том этапе равна 'D:\CASSA\') в процедуре DoWork равна '' наверное есть какая-то хитрость?


Dennis I. Komarov   (2008-02-12 13:20:00) [17]

> procedure TUnload.ServiceExecute(Sender: TService);
> begin
> MainThread := TMainThread.Create;
> end;
>
> end.
>
> в итоге при старте службы пишет что служба была запущена
> а затем остановлена т.к. нечего делать. Может есть какой
> пример по написанию службы при помощи создания доп потоков?

После того, как служба создала поток, ее действие закончилось - она и остановилася

написать службу при помощи создания доп. потоков - низя :)

Сперва разберись с ними по отдельности, а потом склеишь.


Palladin   (2008-02-12 13:06:00) [18]

да забудь ты про SeviceExucte!
поток стартуй на ServiceStart
поток останавливай на ServiceStop


patrick1968   (2008-02-12 13:04:00) [19]

Попытался через дополнительный поток

вот код

unit Unload1;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs, ActiveX, IniFiles,
 DB, ADODB;

type

 TMainThread = class(TThread)
 private
 public
   QDesk : integer;
   TempPath, arrPath, ConnectStringIn, ConnectStringOut : string;
   arrDesk : array of string;
   OraConnection: TADOConnection;
   constructor Create;
 protected
    procedure DoWork;
    procedure Execute; override;
 end;

 TUnload = class(TService)
   OraConnection: TADOConnection;
   procedure ServiceExecute(Sender: TService);
 private
   { Private declarations }
 public
   function GetServiceController: TServiceController; override;
   { Public declarations }
 end;

var
 MainThread : TMainThread;
 Unload: TUnload;

implementation

{$R *.DFM}

procedure ServiceController(CtrlCode: DWord); stdcall;
begin
 Unload.Controller(CtrlCode);
end;

function TUnload.GetServiceController: TServiceController;
begin
 Result := ServiceController;
end;

constructor TMainThread.Create;
var UnloadIni : TIniFile;
    ind, idx : integer;
begin
 inherited Create(True);    

 UnloadIni := TIniFile.Create('prUnload.ini');
 if not FileExists('prUnload.ini')
    then begin
          UnloadIni.WriteInteger( 'MAIN', 'QDESK', 1);
          UnloadIni.WriteString( 'MAIN', 'TEMPPATH', 'C:\');
          UnloadIni.WriteString( 'MAIN', 'ARRPATH', '');
          UnloadIni.WriteString( 'MAIN', 'CONNECTSTRING_IN', '');
          UnloadIni.WriteString( 'MAIN', 'CONNECTSTRING_OUT', '');
          QDesk := UnloadIni.ReadInteger( 'MAIN', 'QDESK', 1);
          TempPath := UnloadIni.ReadString( 'MAIN', 'TEMPPATH', '');
          ArrPath := UnloadIni.ReadString( 'MAIN', 'ARRPATH', '');
          ConnectStringIn := UnloadIni.ReadString( 'MAIN', 'CONNECTSTRING_IN', '');
          ConnectStringOut := UnloadIni.ReadString( 'MAIN', 'CONNECTSTRING_OUT', '');
         end
       else begin
             QDesk := UnloadIni.ReadInteger( 'MAIN', 'QDESK', 1);
             TempPath := UnloadIni.ReadString( 'MAIN', 'TEMPPATH', '');
             ArrPath := UnloadIni.ReadString( 'MAIN', 'ARRPATH', '');
             ConnectStringIn := UnloadIni.ReadString( 'MAIN', 'CONNECTSTRING_IN', '');
             ConnectStringOut := UnloadIni.ReadString( 'MAIN', 'CONNECTSTRING_OUT', '');
            end;
 UnloadIni.Free;

 try
  OraConnection.ConnectionString := ConnectStringIn;
  OraConnection.Connected := true;
 except
 end;

 SetLength( arrDesk, QDesk);
 ind := 0;
 idx := 1;
 arrDesk[ind] := '';
 while (idx <= Length(arrPath)) do begin
    if arrPath[idx] <> ','
      then arrDesk[ind] := arrDesk[ind] + arrPath[idx]
      else begin
            inc(ind);
            arrDesk[ind] := '';
           end;
    inc(idx);
 end;

 Self.Priority := tpHighest;
 Resume;                      
end;

procedure TMainThread.DoWork;
begin
  if FileExists(arrDesk[0] + 'cash001.db')
     then begin
           FileCreate(arrDesk[0] + 'cash001s.db');
          end;
end;

procedure TMainThread.Execute;
begin
    while not Terminated do
    begin
        Synchronize(DoWork);
        Sleep(1000);
    end;
end;

procedure TUnload.ServiceExecute(Sender: TService);
begin
MainThread := TMainThread.Create;
end;

end.

в итоге при старте службы пишет что служба была запущена а затем остановлена т.к. нечего делать. Может есть какой пример по написанию службы при помощи создания доп потоков?


ANB   (2008-02-12 12:21:00) [20]


> работает как надо

Начни писать длинннный файл. А пока он пишется - нажми кнопку. Удивись.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо