Avatar billede thulesen Nybegynder
23. februar 2003 - 18:33 Der er 14 kommentarer og
2 løsninger

Service...

Hej, er der nogen der kan hjælpe mig med at lave en service i delphi ?
Jeg har Delphi Enterprise og Windows 2000 Professional.
Jeg vil gerne have sourcekode til at starte og stoppe en service fra et normalt program,
Og hvordan man laver dette som en service :

unit K8000;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ShellApi, ExtCtrls, ComCtrls, Menus, DB, mySQLDbTables;

CONST
    MaxIOchannel  = longint(64);
TYPE
    TIOchannel    = 1..MaxIOchannel;
type
  TForm1 = class(TForm)
    Timer1: TTimer;
    mySQLDatabase1: TmySQLDatabase;
    mySQLQuery1: TmySQLQuery;
    mySQLQuery1DSDesigner1: TIntegerField;
    mySQLQuery1DSDesigner2: TIntegerField;
    mySQLQuery1DSDesigner3: TIntegerField;
    mySQLQuery1DSDesigner4: TIntegerField;
    mySQLQuery1DSDesigner5: TIntegerField;
    mySQLQuery1DSDesigner6: TIntegerField;
    mySQLQuery1DSDesigner7: TIntegerField;
    mySQLQuery1DSDesigner8: TIntegerField;
    mySQLQuery1DSDesigner9: TIntegerField;
    mySQLQuery1DSDesigner10: TIntegerField;
    mySQLQuery1DSDesigner11: TIntegerField;
    mySQLQuery1DSDesigner12: TIntegerField;
    mySQLQuery1DSDesigner13: TIntegerField;
    mySQLQuery1DSDesigner14: TIntegerField;
    mySQLQuery1DSDesigner15: TIntegerField;
    mySQLQuery1DSDesigner16: TIntegerField;
    mySQLQuery2: TmySQLQuery;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure mySQLQuery1AfterOpen(DataSet: TDataSet);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  n, card_nr:integer;


implementation

{$R *.DFM}

PROCEDURE ConfigAllIOasOutput; stdcall; external 'K8D.dll';
PROCEDURE ConfigIOchannelAsOutput(Channel_no: TIOchannel); stdcall; external 'K8D.dll';
PROCEDURE ClearAllIO; stdcall; external 'K8D.dll';
PROCEDURE SetAllIO; stdcall; external 'K8D.dll';
PROCEDURE SetIOchannel(Channel_no: TIOchannel); stdcall; external 'K8D.dll';
PROCEDURE ClearIOchannel(Channel_no: TIOchannel); stdcall; external 'K8D.dll';
PROCEDURE SelectI2CprinterPort(Printer_no: Longint); stdcall; external 'K8D.dll';
PROCEDURE Start_K8000; stdcall; external 'K8D.dll';
PROCEDURE Stop_K8000; stdcall; external 'K8D.dll';
function ReadIOchannel(Channel_no: TIOchannel):boolean; stdcall; external 'K8D.dll';

procedure TForm1.FormCreate(Sender: TObject);
begin
  Start_K8000;
  SelectI2CprinterPort(2);
  card_nr:=0;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  timer1.enabled:=false;
  Stop_K8000;
  mysqlquery2.SQL.Clear;
  mysqlquery2.SQL.Add('update server set startet = 0');
  mysqlquery2.Active := true;
  mysqlquery2.Active := false;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
i : integer;
begin
  mysqlquery1.refresh;
  for i:=1 to 16 do
  begin
  if mysqlquery1.Fields[i-1].value = 1 then
  begin
  if not readiochannel(i) then
  begin
  ConfigIOchannelAsOutput(i);
  SetIOchannel(i);
  end;
  end
  else
  begin
  if readiochannel(i) then
  begin
  ConfigIOchannelAsOutput(i);
  ClearIOchannel(i);
  end;
  end;
  end;
end;

procedure TForm1.mySQLQuery1AfterOpen(DataSet: TDataSet);
begin
if not timer1.Enabled then
begin
Timer1.Enabled := True;
mysqlquery2.Active := true;
mysqlquery2.Active := false;
end;
end;

end.
Avatar billede martinlind Nybegynder
23. februar 2003 - 18:43 #1
prøv at kig i hjælpen under TService og click på Using Tservice der er et eks.
Avatar billede stoney Nybegynder
24. februar 2003 - 00:17 #2
File-New-Other-Service Application
Når du har lavet din service/application skal du selv
installere din service manuelt i en dosprompt
regsvr32 c:\min_service.dll -install
eller lad dit install program gøre det.


Stoney
Avatar billede thulesen Nybegynder
27. februar 2003 - 16:33 #3
Når jeg prøver at starte servicen går den fast, hvorfor det?
Jeg har lagt koden i OnStop og OnStart, er det ikke rigtigt ?
Avatar billede stoney Nybegynder
27. februar 2003 - 16:46 #4
Det skal være i OnExecute

Det andet burde sige sig selv

Stoney
Avatar billede thulesen Nybegynder
27. februar 2003 - 20:00 #5
Det virker stadigt ikke, jeg får at vide at servicen ikke kunne startes.

Her er koden :

unit main;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs,
  DB, mySQLDbTables, ExtCtrls;

CONST
    MaxIOcard    = longint(3);
    MaxIOchip    = longint(7);
    MaxIOchannel  = longint(64);
    MaxDACchannel = longint(32);
    MaxADchannel  = longint(160);
    MaxDAchannel  = longint(4);
        WM_CAllBack = WM_USER;
TYPE
        TIOcard      = 0..MaxIOcard;
    TIOchip      = 0..MaxIOchip;
    TIOchannel    = 1..MaxIOchannel;
    TDACchannel  = 1..MaxDACchannel;
    TADchannel    = 1..MaxADchannel;
    TDAchannel    = 1..MaxDAchannel;
type
  TService1 = class(TService)
    Timer1: TTimer;
    mySQLDatabase1: TmySQLDatabase;
    mySQLQuery1: TmySQLQuery;
    mySQLQuery2: TmySQLQuery;
    procedure Timer1Timer(Sender: TObject);
    procedure mySQLQuery1AfterOpen(DataSet: TDataSet);
    procedure ServiceStart(Sender: TService; var Started: Boolean);
    procedure ServiceStop(Sender: TService; var Stopped: Boolean);
    procedure ServiceExecute(Sender: TService);
  private
    { Private declarations }
  public
    function GetServiceController: TServiceController; override;
    { Public declarations }
  end;

var
  Service1: TService1;
  n, card_nr:integer;
  dac_ch: array[1..9] of boolean;
var
  IOconfig: ARRAY[0..MaxIOchip] OF Integer;
  IOdata: ARRAY[0..MaxIOchip] OF Integer;
  DAC: ARRAY[1..MaxDACchannel] OF Integer;
  DA: ARRAY[1..MaxDAchannel] OF Integer;

implementation

{$R *.DFM}
{IO CONFIGURATION PROCEDURES}
PROCEDURE ConfigAllIOasInput; stdcall; external 'K8D.dll';
PROCEDURE ConfigAllIOasOutput; stdcall; external 'K8D.dll';
PROCEDURE ConfigIOchipAsInput(Chip_no: TIOchip); stdcall; external 'K8D.dll';
PROCEDURE ConfigIOchipAsOutput(Chip_no: TIOchip); stdcall; external 'K8D.dll';
PROCEDURE ConfigIOchannelAsInput(Channel_no: TIOchannel); stdcall; external 'K8D.dll';
PROCEDURE ConfigIOchannelAsOutput(Channel_no: TIOchannel); stdcall; external 'K8D.dll';

{UPDATE IOdata & IO ARRAY PROCEDURES}
PROCEDURE UpdateIOdataArray(Chip_no: TIOchip; Data:Longint); stdcall; external 'K8D.dll';
PROCEDURE ClearIOdataArray(Chip_no: TIOchip); stdcall; external 'K8D.dll';
PROCEDURE SetIOdataArray(Chip_no: TIOchip); stdcall; external 'K8D.dll';
PROCEDURE SetIOchArray(Channel_no: TIOchannel); stdcall; external 'K8D.dll';
PROCEDURE ClearIOchArray(Channel_no: TIOchannel); stdcall; external 'K8D.dll';

{OUTPUT PROCEDURES}
PROCEDURE IOoutput(Chip_no: TIOchip ; Data: Longint); stdcall; external 'K8D.dll';
PROCEDURE UpdateAllIO; stdcall; external 'K8D.dll';
PROCEDURE ClearAllIO; stdcall; external 'K8D.dll';
PROCEDURE SetAllIO; stdcall; external 'K8D.dll';
PROCEDURE UpdateIOchip(Chip_no: TIOchip); stdcall; external 'K8D.dll';
PROCEDURE ClearIOchip(Chip_no: TIOchip); stdcall; external 'K8D.dll';
PROCEDURE SetIOchip(Chip_no: TIOchip); stdcall; external 'K8D.dll';
PROCEDURE SetIOchannel(Channel_no: TIOchannel); stdcall; external 'K8D.dll';
PROCEDURE ClearIOchannel(Channel_no: TIOchannel); stdcall; external 'K8D.dll';

{6 BIT DAC CONVERTER PROCEDURES}
PROCEDURE OutputDACchannel(Channel_no: TDACchannel ; Data: Longint); stdcall; external 'K8D.dll';
PROCEDURE ClearDACchannel(Channel_no: TDACchannel); stdcall; external 'K8D.dll';
PROCEDURE SetDACchannel(Channel_no: TDACchannel); stdcall; external 'K8D.dll';
PROCEDURE ClearDACchip(Chip_no: TIOcard); stdcall; external 'K8D.dll';
PROCEDURE SetDACchip(Chip_no: TIOcard); stdcall; external 'K8D.dll';
PROCEDURE ClearAllDAC; stdcall; external 'K8D.dll';
PROCEDURE SetAllDAC; stdcall; external 'K8D.dll';

{8 BIT DA CONVERTER PROCEDURES}
PROCEDURE OutputDAchannel(Channel_no: TDAchannel ; Data: Longint); stdcall; external 'K8D.dll';
PROCEDURE ClearDAchannel(Channel_no: TDAchannel); stdcall; external 'K8D.dll';
PROCEDURE SetDAchannel(Channel_no: TDAchannel); stdcall; external 'K8D.dll';
PROCEDURE ClearAllDA; stdcall; external 'K8D.dll';
PROCEDURE SetAllDA; stdcall; external 'K8D.dll';

{GENERAL PROCEDURES}
PROCEDURE SelectI2CprinterPort(Printer_no: Longint); stdcall; external 'K8D.dll';

PROCEDURE Start_K8000; stdcall; external 'K8D.dll';
PROCEDURE Stop_K8000; stdcall; external 'K8D.dll';

{INPUT FUNCTIONS}
function ReadIOchip(Chip_no: TIOchip):longint; stdcall; external 'K8D.dll';
function ReadIOchannel(Channel_no: TIOchannel):boolean; stdcall; external 'K8D.dll';
function ReadADchannel(Channel_no:TADchannel):longint; stdcall; external 'K8D.dll'
PROCEDURE ReadIOconficArray(Buffer:Pointer); stdcall; external 'K8D.dll';
PROCEDURE ReadIOdataArray(Buffer:Pointer); stdcall; external 'K8D.dll';
PROCEDURE ReadDACarray(Buffer:Pointer); stdcall; external 'K8D.dll';
PROCEDURE ReadDAarray(Buffer:Pointer); stdcall; external 'K8D.dll';

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

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

procedure TService1.Timer1Timer(Sender: TObject);
var
i : integer;
begin
  mysqlquery1.refresh;
  for i:=1 to 16 do
  begin
  if mysqlquery1.Fields[i-1].value = 1 then
  begin
  if not readiochannel(i) then
  begin
  ConfigIOchannelAsOutput(i);
  SetIOchannel(i);
  end;
  end
  else
  begin
  if readiochannel(i) then
  begin
  ConfigIOchannelAsOutput(i);
  ClearIOchannel(i);
  end;
  end;
  end;
end;

procedure TService1.mySQLQuery1AfterOpen(DataSet: TDataSet);
begin
if not timer1.Enabled then
begin
Timer1.Enabled := True;
mysqlquery2.Active := true;
mysqlquery2.Active := false;
end;
end;

procedure TService1.ServiceStart(Sender: TService; var Started: Boolean);
begin
  Start_K8000;
  SelectI2CprinterPort(2);
  card_nr:=0;
end;

procedure TService1.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
  timer1.enabled:=false;
  Stop_K8000;
  mysqlquery2.SQL.Clear;
  mysqlquery2.SQL.Add('update server set startet = 0');
  mysqlquery2.Active := true;
  mysqlquery2.Active := false;
end;

procedure TService1.ServiceExecute(Sender: TService);
begin
  Start_K8000;
  SelectI2CprinterPort(2);
  card_nr:=0;
end;

end.

Hvad er problemmet?
Avatar billede thulesen Nybegynder
28. februar 2003 - 13:56 #6
Kan det være fordi at jeg har mysql-komponenten som 'demo', så der popper et vindue op hvor man skal trykke på ok før den connecter...?
Avatar billede thulesen Nybegynder
02. marts 2003 - 11:26 #7
Er der ikke nogen der kan hjælpe mig ?
Jeg har funktioner på OnStart, OnStop og OnExecute er det ikke rigtigt?
Avatar billede martinlind Nybegynder
02. marts 2003 - 11:41 #8
JA, du du skal sætte en property på din servce hvis du skal ha' mulighed for at lave GUI fra den, jeg kan ikke lige huske hvad den hedder, så den venter sikker på et ok, som du ikke kan se

/Martin
Avatar billede thulesen Nybegynder
02. marts 2003 - 12:23 #9
Ok, nu har jeg sat Interactive til True, men det virker stadigt ikke...
Jeg får nu den dialogboks hvor jeg skal trykke ok, men servicen kan stadig ikke startes.
Servicen bruger en dll, kan det være der problemmet ligger?
Dll'en ligger i samme mappe som servicens exe fil...
Avatar billede martinlind Nybegynder
02. marts 2003 - 12:53 #10
Det tror jeg nu ikke, måske det er et timming problem, du kan evt. prøve at fjerne den del der viser dialogboxen og se om den så starter op

/Martin
Avatar billede martinlind Nybegynder
02. marts 2003 - 12:55 #11
Hvis det er et timming problem kan du lægge alt din kode i en seperat tråd og så bare starte og stoppe den tråd fra din servce
Avatar billede thulesen Nybegynder
02. marts 2003 - 17:59 #12
Det virker stadigt ikke, selvom jeg udkommenterer alt der har med mysql at gøre.
Når jeg prøver at starte servicen fra dens exe fil, får jeg "Runtime error 217 at 00008140", hvad betyder det?
Avatar billede thulesen Nybegynder
03. marts 2003 - 14:56 #13
Undskyld, nu har jeg rettet fejlen med runtime error, men det virker stadigt ikke...
Er der nogen bud på hvad der så kan være galt?
Er der nogen der gider at lave en simpel service som virker i delphi 6.0 og sende den til mig (thomas@thulesen.dk)?
Avatar billede martinlind Nybegynder
05. marts 2003 - 10:51 #14
har ikke lige nogle ider
Avatar billede martinlind Nybegynder
05. marts 2003 - 11:04 #15
har sendt noget til dig

prøv evt. at kigge på www.undu.com
Avatar billede thulesen Nybegynder
05. marts 2003 - 17:33 #16
Mange tak for hjælpen..!
Nu virker det, jeg brugte dog ikke dit ex. martinlind. Jeg begyndte forfra og tog en ting ad gangen, og så virkede det selvfølgelig...
Jeg prøver at dele pointsne lige, jeg tager halvdelen selv, da jeg ikke fik noget brugeligt svar, men mange tak for svarene alligevel...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester