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'е, только там она их не видит почему-то, помогите разобраться, заранее благодарен.


Dennis I. Komarov   (2008-02-12 11:45:00) [21]

> [15] patrick1968 ©   (12.02.08 11:22)

Остовной поток сервиса - для его управления. Все действия в дополнительные нити.

> причем если удаляю экзист, и просто на том месте создаю
> файл с путем arrDesk[0], только создает она его не там где
> надо а в system32, получается так что в данной ситуации
> можно использовать только потоки?


ЗЫ У тебя проблемы с CurrentDir


patrick1968   (2008-02-12 11:22:00) [22]

Сервис выкидывал, делал всё под кнопкой - работает как надо, а все эти операторы вставлял для проверки, оригинальный код Execute следующий

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

причем если удаляю экзист, и просто на том месте создаю файл с путем arrDesk[0], только создает она его не там где надо а в system32, получается так что в данной ситуации можно использовать только потоки?


ANB   (2008-02-12 09:46:00) [23]


> FileCreate(arrDesk[0] + 'cash001s.db');

Скажи, пожалуйста, что делает у тебя этот оператор ?

На будующее :
1) Выкини сервис и напиши сначала обычное приложение, в котором нужные тебе действия выполняй под кнопкой.
2) Учти граблю : файл может быть обнаружен экзистом, но при этом еще писаться, посему ты должен убедится, что файл уже весь записали, и только потом его перемещать.


Сергей М.   (2008-02-12 08:27:00) [24]


> patrick1968 ©   (11.02.08 17:47) [3]
>
> массив arrDesk, который определяется в старте


При старте он не определяется.

Определяется он как раз в public, создается (с нулевой длиной) при создании объекта UnLoad, а при старте просто изменяется его длина.


> прога не работает (MoveFile) не перетаскивается файл
>


А причем здесь тогда

> она их не видит


?

Видимость переменной - понятие, относящееся ко времени компиляции, а не ко времени выполнения.


Slym   (2008-02-12 04:42:00) [25]

в ServiceStart запускай дополнительный поток, в котором делай все что угодно: CoInitialize, создавай конекшены, мувь файло... ServiceExecute не для этого


Slym   (2008-02-12 04:41:00) [26]

в ServiceStart запускай дополнительный поток, в котором делай все что угодно: CoInitialize, создавай конекшены, мувь файло... ServiceExecute не для этого


ketmar   (2008-02-11 19:16:00) [27]

что это ([0]) было? %-)

---
Understanding is not required. Only obedience.


Palladin   (2008-02-11 18:06:00) [28]

идем читаем
http://www.delphimaster.ru/articles/panov/index.html

потом долго думаем...
кстати пока думаем, форматируем исходный код и пытаемся объяснить мне почему CoInitialize вызвано перед циклом While, а CoUninitialize вызывается на каждой итерации... честно честно, мне очень интересно...


Palladin   (2008-02-11 18:03:00) [29]

мда... ознакомился подробней с твоим кодом...
бред...


patrick1968   (2008-02-11 18:03:00) [30]

ВИзуально, а что разве так не должно быть?


Palladin   (2008-02-11 18:00:00) [31]


> проблема в том, что прога не работает

замечательная проблема


>  (MoveFile) не перетаскивается файл

ты это визуально определил, аль GetLastError поймал?


patrick1968   (2008-02-11 17:57:00) [32]

проблема в том, что прога не работает (MoveFile) не перетаскивается файл


Palladin   (2008-02-11 17:49:00) [33]


> массив arrDesk, который определяется в старте и объявлен
> в разделе public

ну и чего с того то? проблемма где? я вот в упор понять не могу


> в стартовой процедуре определил переменные, которые нужны
> при Execute'е, только там она их не видит


что это вообще значит...


>  CoInitialize/CoUnInitialize на будущее т.к. далее буду
> использовать ADO вычитал на каком-то форуме об этой необходимости

их необходимость более чем под вопросом


patrick1968   (2008-02-11 17:47:00) [34]

массив arrDesk, который определяется в старте и объявлен в разделе public, а CoInitialize/CoUnInitialize на будущее т.к. далее буду использовать ADO вычитал на каком-то форуме об этой необходимости.(вообще написание сервисов для меня - новинка, поэтому может есть ссылка на толковую статью, чтобы не задавать слишком простых вопросов)


Palladin   (2008-02-11 17:45:00) [35]


> patrick1968 ©   (11.02.08 17:24)

ну как бы задача понятна... проблема только непонятна... кто на ком стоял...


Сергей М.   (2008-02-11 17:31:00) [36]


> в стартовой процедуре определил переменные, которые нужны
> при Execute'е


Это какие же ?

И зачем в обработчике OnExecute вызовы CoInitialize/CoUnInitialize ?


Страницы:   1 2

Наверх

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