Hallo Zusammen,
ich versuche mich aktuell leider vergeblich an einem
Indy UDPServer als Dienst.
Die Dienst Struktur und der Dienst selber laufen.
Leider empfängt der Server nichts.
Wen ich den gleichen Code in einem Programm starte gehts einwandfrei.
Leider finde ich kaum info über die Dienstumgebund die dafür vorgesehen werden muss damit der Dienst auch Zugriff auf das Netzwerk bekommt.
Hier erst mal der Dienst an sich:
Code:
var
STARITZzeit: TSTARITZzeit;
Log : TStreamWriter;
implementation
{%CLASSGROUP '
Vcl.Controls.TControl'}
{$R *.dfm}
procedure ServiceController(CtrlCode: DWord); stdcall;
begin
STARITZzeit.Controller(CtrlCode);
end;
function TSTARITZzeit.GetServiceController: TServiceController;
begin
Result := ServiceController;
end;
procedure TSTARITZzeit.ServiceContinue(Sender: TService; var Continued: Boolean);
begin
Continued := True;
end;
procedure TSTARITZzeit.ServiceStart(Sender: TService; var Started: Boolean);
begin
Log := TStreamWriter.Create(TFileStream.Create('c:\log\staritz.log', fmCreate or fmShareDenyWrite));
started := ConnectServices(log, Zeit_UDP);
end;
procedure TSTARITZzeit.Zeit_UDPUDPRead(AThread: TIdUDPListenerThread; const AData: TIdBytes; ABinding: TIdSocketHandle);
begin
Log.WriteLine('UDP Recive!');
sec_Zeit_UDPUDPRead(Zeit_UDP, XMLZeit, XMLSend, AThread, AData, ABinding);
end;
end.
Der UDP Server liegt auf der Mainform und wird nach "unten" durchgereicht.
Hier der Code der
Unit:
Code:
var adsC : TAdsConnection;
adsM : TAdsTable;
adsT : TAdsTable;
function ConnectServices(log: TStreamWriter; Zeit_UDP: TIdUDPServer): Boolean;
begin
result := FALSE;
... öffne ein paar Datenbänke...
// Einmal testen ob der ADS läuft...
try
ADSC.IsConnected := TRUE;
except
Log.WriteLine('Dictionary conect failed!');
exit;
end;
// Datenbänke testen
try
AdsM.Active := TRUE;
except
Log.WriteLine('Database Mitar conect failed!');
exit;
end;
try
AdsT.Active := TRUE;
except
Log.WriteLine('Database TimeTable conect failed!');
exit;
end;
// Testen ob der UDP-Port geht...
try
Zeit_UDP.ThreadedEvent := TRUE;
Zeit_UDP.Active := TRUE;
Except
Log.WriteLine('UDP conect failed!');
exit;
end;
ADSC.IsConnected := FALSE;
Log.WriteLine('Staritz aktiv!');
result := TRUE;
end;
procedure sec_Zeit_UDPUDPRead(Zeit_UDP: TIdUDPServer; XMLZeit: TJvSimpleXML; XMLSend: TJvSimpleXML; AThread: TIdUDPListenerThread; const AData: TIdBytes; ABinding: TIdSocketHandle);
var i : integer;
sData, sRFID : String;
rGoOut, rGoIn, rNotFound : Boolean;
tempElement : TJvSimpleXMLElem;
begin
// Code Empfang und auflösen
for i:= 0 to length(AData)-1 do
sData := sData + chr(AData[i]);
XMLZeit.LoadFromString(sData);
try
...
Ich schreibe mir in einem Log weg was intern passiert.
Dienst kommt bis zum "Staritz aktiv!"
Das heißt der UDP Server arbeitet.
Ports usw. habe ich natürlich schon getestet.
Aber egal wie ich ihn installiere kommt nichts an.
Hat jemand eine Idee?
Threadevent ist im Server auf TRUE!
Gelesen hatte ich schon das deswegen KEINE weiter OnExecute im Dienst benötigt wird.
Für jede Idee wäre ich dankbar!
WIN 10 - Delphi XE7
Danke