Einzelnen Beitrag anzeigen

Caps

Registriert seit: 23. Mär 2006
Ort: Leipzig
299 Beiträge
 
#1

Sichtbarkeit von Variablen bei Diensten

  Alt 6. Apr 2010, 10:40
Moin,

ich bin dabei, einen Dienst zu programmieren, und habe folgendes Problem:
Im Interface-Teil der Unit habe ich einige Variablen deklariert, die ich im ServiceAfterInstall-Handler des Dienstes aus einer INI-Datei lese. Das geht auch - d.h. die Variablen (global) haben innerhalb der Funktion ServiceAfterInstall die eingelesenen Werte.
Jedoch innerhalb der Funktion Log sind die Werte verschwunden. Da komm ich nicht klar. Keine Ahnung, warum.
Ich benutze showmessage, um die Werte auszugeben.

Die Quelle:

Delphi-Quellcode:
unit Unit1;


interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs,
  Inifiles;

type
  Tmvideo_sync = class(TService)
    procedure ServiceExecute(Sender: TService);
    procedure ServiceStart(Sender: TService; var Started: Boolean);
    procedure ServiceStop(Sender: TService; var Stopped: Boolean);
    procedure ServiceAfterUninstall(Sender: TService);
    procedure ServiceBeforeUninstall(Sender: TService);
    procedure ServiceAfterInstall(Sender: TService);
  private
    { Private-Deklarationen }
  public
    function GetServiceController: TServiceController; override;
    { Public-Deklarationen }
  end;


var
   mvideo_sync: Tmvideo_sync;

   videos_dir, // Relativer Pfad
   videos_neu_dir, // Relativer Pfad
   mvideo_sync_homedir : String; // Absoluter Pfad zur Dienst-Executable

   IniFile : TIniFile;
   LogFileName : String; // Ohne Pfadangabe
   IniStringList : TStringList;

   hour_of_execution : Word; // Stunde, zu der das Update durchgeführt werden soll
   UpdateExecuted : Boolean; // Wurde das Update durchgeführt? Dient dazu, einen weiteren Durchlauf während der "Update-Stunde" zu verhindern


implementation

{$R *.DFM}

const
     IniFileName = 'mvideo_sync.ini';


procedure Log(Msg: String);
var
   DTStr : String;
   LogFile : Textfile;
begin showmessage(IntToStr(hour_of_execution) + ', ' + LogFileName + ', ' + videos_dir + ', ' + videos_neu_dir + ', ' + mvideo_sync_homedir); // <------ PROBLEM
  DateTimeToString(DTStr, 'dd.mm.yy hh:mm', now);
  AssignFile(LogFile, mvideo_sync_homedir + '\' + LogFileName);
  Try
     if not FileExists(mvideo_sync_homedir + '\' + LogFileName) then //ReWrite(LogFile)
                                                                else ;//Append(LogFile);
// Try
// WriteLn(LogFile, DTStr + ' : ' + Msg);
// except end;
  finally
// CloseFile(LogFile);
  end;

end;


procedure ExecNewProcess(ProgramName : String); // Mit relativem Pfad aufzurufen
var
   StartInfo : TStartupInfo;
   ProcInfo : TProcessInformation;
   CreateOK : Boolean;
   AbsProgramName : String;
begin
AbsProgramName := mvideo_sync_homedir + '\' + ProgramName;
{ fill with known state }
FillChar(StartInfo, SizeOf(TStartupInfo), #0);
FillChar(ProcInfo, SizeOf(TProcessInformation), #0);
StartInfo.cb := SizeOf(TStartupInfo);

CreateOK := CreateProcess(nil, PChar(AbsProgramName), nil, nil, false, CREATE_NEW_PROCESS_GROUP+NORMAL_PRIORITY_CLASS, nil, nil, StartInfo, ProcInfo);

if CreateOK then
   //may or may not be needed. Usually wait for child processes
   WaitForSingleObject(ProcInfo.hProcess, INFINITE)
            else begin
                 // Log error
                 MessageDlg('Scheiße!', mtError, [mbOK], 0);
                 exit;
                 end;
end;


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


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


procedure Tmvideo_sync.ServiceExecute(Sender: TService);
var
   h, m, s, ms : Word;
begin
while not terminated do begin
      //ServiceThread.ProcessRequests(false);
      DecodeTime(now, h, m, s, ms);
      if h = hour_of_execution + 1 then UpdateExecuted := false; // Indikator rücksetzen, um in ca. 23 Stunden wieder ready zu sein
      if (h = hour_of_execution) and not UpdateExecuted then begin
         Log('Beginning Update...');
         // irgendwas...
         Log('Finished Update');
         UpdateExecuted := true;
                                                             end;
                        end;
end;


procedure Tmvideo_sync.ServiceStart(Sender: TService; var Started: Boolean);
begin
Started := true;
UpdateExecuted := false;

Log('Service started');
end;


procedure Tmvideo_sync.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
Log('Service stopped');
end;

procedure Tmvideo_sync.ServiceAfterUninstall(Sender: TService);
begin
Log('Service has been uninstalled');
end;

procedure Tmvideo_sync.ServiceBeforeUninstall(Sender: TService);
begin
Log('Service is tried to be uninstalled');
end;

procedure Tmvideo_sync.ServiceAfterInstall(Sender: TService);
begin
IniFile := TIniFile.Create(ExtractFilePath(ParamStr(0)) + IniFileName);
IniStringList := TStringList.Create;

IniFile.ReadSectionValues('mvideo_sync', IniStringList);

hour_of_execution := StrToInt(IniStringList.Values ['hour_of_execution']);
LogFileName := IniStringList.Values ['logfile'];
videos_dir := IniStringList.Values ['videos_dir'];
videos_neu_dir := IniStringList.Values ['videos_neu_dir'];
mvideo_sync_homedir := IniStringList.Values ['mvideo_sync_homedir'];

showmessage(IntToStr(hour_of_execution) + ' ' + LogFileName + ' ' + videos_dir + ' ' + videos_neu_dir + ' ' + mvideo_sync_homedir); // <----- KEIN PROBLEM
end;

end.

Für jede Idee dankbar,
Caps
"Der Mode cmCFS8 ist prohibitär und von mir entwickelt."
  Mit Zitat antworten Zitat