Ошибка при установке службы Windows

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ошибка при установке службы Windows

Сообщение Freezz » 23.09.2015 10:00:19

Добрый день уважаемые!
Пытаюсь создать службу Windows
Код: Выделить всё
unit main;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, DaemonApp, INIFiles, lNet, ukvm_cmd;

type
  Tsvctst = class(TDaemon)
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  svctst: Tsvctst;

type
  TlNetClass = Class
  private
    FNet,FNetSrv: TLTCP;
    tmf: Boolean;
    IP: String;
    Port, sPort: Word;

    procedure onEr(const msg: String; aSocket: TLSocket);
    procedure onCn(aSocket: TLSocket);
    procedure onRe(aSocket: TLSocket);
    procedure onDs(aSocket: TLSocket);
    procedure onErSrv(const msg: String; aSocket: TLSocket);
    procedure onAcSrv(aSocket: TLSocket);
    procedure onReSrv(aSocket: TLSocket);
    procedure onDsSrv(aSocket: TLSocket);
    procedure Tmr();

  public
    procedure Run;
    constructor Build;
    destructor Burn;
  end;

implementation

procedure RegisterDaemon;
begin
  RegisterDaemonClass(Tsvctst)
end;

{$R *.lfm}

//------------CLIENT------------------------------------------------------------
procedure TlNetClass.onCn(aSocket: TLSocket);
begin
  Writeln(UTF8ToConsole('Соединение с сервером установлено'));
  tmf := False;
end;

procedure TlNetClass.onRe(aSocket: TLSocket);
var s: String;
begin

  if aSocket.GetMessage(s) > 0 then begin
//    Writeln(UTF8ToSys(s));
  FNet.SendMessage(SysToUTF8(s));
  end;
end;

procedure TlNetClass.onDs(aSocket: TLSocket);
begin
  Writeln(UTF8ToConsole('Соединение потеряно'));
  tmf := True;
  Tmr;
end;

procedure TlNetClass.onEr(const msg: String; aSocket: TLSocket);
begin
//  Writeln(msg);
  tmf := True;
  Tmr;
end;
//------------SERVER------------------------------------------------------------
procedure TlNetClass.onAcSrv(aSocket: TLSocket);
begin
  Writeln(UTF8ToConsole('Соединение с клиентом ' + aSocket.PeerAddress + ' установлено'));
//  tmf := False;
end;

procedure TlNetClass.onReSrv(aSocket: TLSocket);
var s: String;
begin
  if aSocket.GetMessage(s) > 0 then begin
    s := strCMD(s);
    if s <> '' then FNetSrv.SendMessage(s + #13#10);
  end;
end;

procedure TlNetClass.onDsSrv(aSocket: TLSocket);
begin
  Writeln(UTF8ToConsole('Соединение c клиентом ' + aSocket.PeerAddress + ' потеряно'));
//  tmf := True;
//  Tmr;
end;

procedure TlNetClass.onErSrv(const msg: String; aSocket: TLSocket);
begin
  Writeln(msg);
//  tmf := True;
//  Tmr;
end;
//------------------------------------------------------------------------------



procedure TlNetClass.Run;
var //q: Boolean;
    cfgINI: TINIFile;
begin
  cfgINI := TINIFile.Create(ExtractFilePath(paramstr(0)) + 'rmtclient.cfg');
  IP := cfgINI.ReadString('rmtserver', 'address', '');
  Port := StrToInt(cfgINI.ReadString('rmtserver', 'port', '0'));
  sPort := StrToInt(cfgINI.ReadString('rmtclient', 'port', '0'));
  tmf := False;
//  q := False;
  FNet.Connect(IP, Port);
  FNetSrv.Listen(sPort);
//  if FNet.Connect(Addr, Port) then begin
//    Writeln(UTF8ToConsole('''Escape'' - выход'));
    repeat
      FNetSrv.CallAction;
      FNet.CallAction;
//      if KeyPressed then begin
//       if ReadKey = #27 then q := True;
//      end;
    until False;
//  end;
end;

constructor TlNetClass.Build;
begin
  tmf := False;
  FNetSrv := TLTcp.Create(nil);
  FNet.OnError := @OnEr;
  FNet.OnReceive := @OnRe;
  FNet.OnDisconnect := @OnDs;
  FNet.OnConnect := @OnCn;
  FNet.Timeout := 100;
  FNet.ReuseAddress := True;
  FNetSrv := TLTCP.Create(nil);
  FNetSrv.OnError := @OnErSrv;
  FNetSrv.OnReceive := @OnReSrv;
  FNetSrv.OnDisconnect := @OnDsSrv;
  FNetSrv.OnAccept := @OnAcSrv;
  FNetSrv.Timeout := 100;
  FNetSrv.ReuseAddress := True;
end;

destructor TlNetClass.Burn;
begin
  FNet.Free;
  FNetSrv.Free;
end;
//------------Таймер------------------------------------------------------------
procedure TlNetClass.Tmr;
begin
    if tmf then begin
      sleep (3000);
      FNet.Connect(IP, Port);
    end;
end;
//------------------------------------------------------------------------------

initialization
  RegisterDaemon;
  with TlNetClass.Build do begin
    Run;
    Burn;
  end;
end.

Код: Выделить всё
unit daemon;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, DaemonApp;

type
  Tsvcmaper = class(TDaemonMapper)
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  svcmaper: Tsvcmaper;

implementation

procedure RegisterMapper;
begin
  RegisterDaemonMapper(Tsvcmaper)
end;

{$R *.lfm}


initialization
  RegisterMapper;
end.


Компилируется проект без ошибок, но при установке службы
svctest.exe -i

появляется ошибка
C:\Project\daemontest>svctest.exe -i
An unhandled exception occurred at $0041829C:
EAccessViolation: Access violation
$0041829C TLNETCLASS__BUILD, line 145 of main.pas
$004184C9 MAIN_$$_init, line 177 of main.pas
$0040DB64

line 177 of main.pas - это строка - with TlNetClass.Build do begin
line 145 of main.pas - это строка - FNet.OnError := @OnEr;

Подскажите что не так сделал?
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Freezz
новенький
 
Сообщения: 10
Зарегистрирован: 13.03.2015 13:23:22

Re: Ошибка при установке службы Windows

Сообщение hovadur » 23.09.2015 21:05:06

Код: Выделить всё
  FNetSrv := TLTcp.Create(nil);
  FNet.OnError := @OnEr;

FNetSrv инициализируется, а FNet нет.
hovadur
постоялец
 
Сообщения: 116
Зарегистрирован: 31.01.2013 15:50:41

Re: Ошибка при установке службы Windows

Сообщение Freezz » 25.09.2015 07:49:21

hovadur, спасибо. Вместо FNetSrv в этой строке должно быть FNet, ошибся. И ведь, несколько раз перепроверял :oops:
Freezz
новенький
 
Сообщения: 10
Зарегистрирован: 13.03.2015 13:23:22


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 239

Рейтинг@Mail.ru