| Autor |
Beitrag |
Talbot
      
Beiträge: 44
Win 2000, Win98, WinXP Prof, Linux(Suse, Gentoo, Debian, RedHat)
D6 Enterprise
|
Verfasst: Di 20.09.05 12:00
Ich möchte mir einen Dienst schreiben, der Daten per TCP/IP empfängt und diese über ADO Komponenten in einer Datenbank ablegt.
Nur habe ich den Eindruck das die ADO Komponenten im Dienst überhaupt nichts tun.
Hat da jemand Erfahrung?
|
|
rochus
      
Beiträge: 416
Win XP Prof, Fedora Core 4, SuSE 7.0
D7 Ent, D2005 Pers
|
Verfasst: Di 20.09.05 12:24
Hallo,
Ich arbeite auch an einem Dienst, bei dem ADO Komponenten eingesetzt werden und ich hatte bisher keinerlei Probleme damit! Vielleicht würde es dir helfen, wenn du den Dienst selbst nicht direkt schreibst, sondern der Dienst nur ein Skelett ist, welches den "echten" Dienst aus ner DLL dazulädt. Der Grund dafür ist, dass ne DLL wesentlich einfacher zu debuggen ist als ein Service.
Gruß
_________________ Im Nachhinein ist man immer ein Schlauch!
"Dream as if you'll live forever, live as if you'll die today!" James Dean
|
|
Talbot 
      
Beiträge: 44
Win 2000, Win98, WinXP Prof, Linux(Suse, Gentoo, Debian, RedHat)
D6 Enterprise
|
Verfasst: Di 20.09.05 12:29
Okay, nur hab ich leider keine Idee wie ich eine DLL programmiere. Kannst du mir da einen Tipp geben wo ich gute Informationen dazu finde?
Ich hoffe das ich das auf die Reihe bekomm. Ist nämlich für's Abschlussprojekt meiner Ausbildung. Habe noch 3 Wochen Zeit.
|
|
rochus
      
Beiträge: 416
Win XP Prof, Fedora Core 4, SuSE 7.0
D7 Ent, D2005 Pers
|
Verfasst: Di 20.09.05 12:38
Oh naja okay, also du musst dich entscheiden, inwiefern du "neues" für deine Abschlussprüfung nutzen willst, das du noch nicht kennst, oder ob du lieber bei dem bleibst, was du schon kannst.
Aber solltest du dich dazu entscheiden, eine DLL zu schreiben, findest du hier ein Tutorial dafür. Solltest du zwischen deinem Dienst und der DLL Daten in Form von Strings austauschen wollen (auch wenn die in einer Klasse sind o.ä.), dann musst du als erste Unit beider Projekt-Dateien ShareMem (oder besser: FastShareMem) einbinden.
Falls du noch Informationen darüber möchtest, wie man einen modularisierten Dienst schreibt, der einen Kern-Service hat und entsprechende Module dynamisch nachlädt, meld dich. Hab mir da in letzter Zeit mal gedanken darüber gemacht.
Gruß
_________________ Im Nachhinein ist man immer ein Schlauch!
"Dream as if you'll live forever, live as if you'll die today!" James Dean
|
|
Talbot 
      
Beiträge: 44
Win 2000, Win98, WinXP Prof, Linux(Suse, Gentoo, Debian, RedHat)
D6 Enterprise
|
Verfasst: Di 20.09.05 12:44
Hm. Ich werde mich jetzt erstmal mit dem DLL Tutorial beschäftigen. Scheint ja erstmal nicht so schwierig zu sein. Wenn ich damit fertig bin, werd ich mich hier noch einmal melden.
Vielen Dank erstmal für die freundliche Hilfe.
Edit:
Der Dienst ist das einzige was ich noch fertig Programmieren muss, bevor ich die Abschlussdoku schreiben muss.
Von daher müsste das mit der Zeit ganz gut klappen.
|
|
Talbot 
      
Beiträge: 44
Win 2000, Win98, WinXP Prof, Linux(Suse, Gentoo, Debian, RedHat)
D6 Enterprise
|
Verfasst: Di 20.09.05 13:04
So.
Ich habe mir das DLL Tutorial durchgelesen und das war ja nicht so kompliziert. Jetzt wollte ich das auf meine Anwendung übertragen und stehe vor dem ersten Problem.
Wenn ich den Debugger aktivieren will, muss ich eine Host-Anwendung angeben. Ist das dann mein Service?
|
|
rochus
      
Beiträge: 416
Win XP Prof, Fedora Core 4, SuSE 7.0
D7 Ent, D2005 Pers
|
Verfasst: Di 20.09.05 13:20
Hi,
eigentlich ja, aber solltest du WinXP nutzen, klappt das nicht immer so ganz. Lies dir mal meinen Beitrag zum Debuggen einer DLL durch.
Dein Service muss im Prinzip nachher nichts anderes machen, als die DLL beim Initialize zu laden und am Ende eben wieder freizugeben... Irgendwelche Messages, die ein Dienst erhalten kann, musst du eben an deine DLL (bzw. passende Funktionen) weiterreichen.
Wenn du meinen Beitrag gelesen hast und dich fragst, was das "kleine Testprogramm" sein soll, dann sollte das eben die DLL laden -> genau das machen, was der Dienst später tun soll.
_________________ Im Nachhinein ist man immer ein Schlauch!
"Dream as if you'll live forever, live as if you'll die today!" James Dean
|
|
wdbee
      
Beiträge: 628
Erhaltene Danke: 1
|
Verfasst: Di 20.09.05 13:30
Hallo Talbot,
ich setze auch einen Dienst ein, der ADO-Komponenten nutzt. Dabei sind mir keine grundlegenden Probleme untergekommen. Um das Problem mit dem Debuggen zu umgehen, verwende ich folgendes Konzept (bei allen Diensten):
Ich definiere eine Projektgruppe mit zwei Projekten, einer normalen Anwendung und einem Dienst. Alle Module des Programms werden in separaten Units programmiert und in beide Projekte aufgenommen. Das normale Programm lässt sich normal debuggen und enthält auch Anzeigen mit Protokollen o.ä. Hilfen für die Fehlersuche. Es dient nur dazu, die eigentlichen Units zu starten und zu testen. Alle Funktionen sind dann in beiden Projekten identisch. Der Dienst läuft allerdings unter einem anderen Account (z.B. lokales System) und in einem anderen Verzeichnis (c:\windows\system32). Daraus entstehende Fehlerquellen sind also separat zu beachten.
Diese Methode hat sich in der Praxis als sehr bequem und flexibel erwiesen.
|
|
Talbot 
      
Beiträge: 44
Win 2000, Win98, WinXP Prof, Linux(Suse, Gentoo, Debian, RedHat)
D6 Enterprise
|
Verfasst: Di 20.09.05 13:51
Nun, so wie's aussieht mach ich dann irgendwas falsch.
Ich habe bisher genau wie wdbee eine Anwendung mit den gleich Komponenten und Anweisungen bestückt wie den Dienst.
Nur in der Anwendung hats geklappt und im Dienst nicht. :-/
Vielleicht muss ich doch noch etwas tiefer forschen.
|
|
wdbee
      
Beiträge: 628
Erhaltene Danke: 1
|
Verfasst: Di 20.09.05 14:01
Wie oben gesagt, die Unterschiede im Account und im Verzeichnis lassen sich so nicht unbedingt verhindern. Deshalb solltest du da mal nachforschen (Berechtigungen, Pfade usw.)
Auch muss dir bewusst sein, dass ein Dienst nicht interaktiv ist, also keine Ausgaben (Showmessage usw.) zulässt. Ich schreibe alle Meldungen immer in Logfiles.
Als erstes solltest du mal feststellen, ob die Anmeldung bei der DB beim Dienst erfolgreich ist. Kommt da evt. ein Login-Fenster, dass niemand sieht?
|
|
Talbot 
      
Beiträge: 44
Win 2000, Win98, WinXP Prof, Linux(Suse, Gentoo, Debian, RedHat)
D6 Enterprise
|
Verfasst: Di 20.09.05 14:15
Ich war wohl nur zu ungeduldig mit der Fehlersuche. Ich habe bereits eine ausgabe in logfiles gemacht und damit ist vieles einfacher. jetzt bin ich der Sache auf der Spur.
Vielen Dank für die Hilfe.
|
|
Talbot 
      
Beiträge: 44
Win 2000, Win98, WinXP Prof, Linux(Suse, Gentoo, Debian, RedHat)
D6 Enterprise
|
Verfasst: Mi 21.09.05 10:22
Neues Problem:
Ich kann der Connection nicht den passenden Connection String zuweisen.
Ich weiss auch nicht warum. der ist eigentlich OK. Hier ein Code-Ausschnitt:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| procedure Tsrvc_EMServer.ServiceCreate(Sender: TObject); begin windir := GetWinDir; settings := TInifile.Create(windir + '/EMServer.ini'); ServerSocket1.Port := settings.ReadInteger('Connection','Port',12345); datapath := Settings.ReadString('Database','Path' + '\',GetCurrentDir + '\data\'); databasename := settings.ReadString('Database','Filename','EMServer.mdb'); logfile := settings.ReadString('Filenames','Logfile','C:\log.txt'); transferfile := settings.ReadString('Filenames','Transferfile','C:\transfer.xml');
constring := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' + datapath + databasename + ';Persist Security Info=False'; con_EMServer.ConnectionString := constring; con_EMServer.Connected := True; tbl_sdaEM.Active := True; end; |
Wennn ich die Anweisung
Delphi-Quelltext 1: 2: 3: 4:
| constring := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' + datapath + databasename + ';Persist Security Info=False'; |
auskommentiere gehts.
Ebenso wenn ich
Delphi-Quelltext 1: 2:
| con_EMServer.ConnectionString := constring; |
ausblende.
Jetzt könnte man annehmen, in den Variablen steht mist, etc. aber in der Anwendung die ich mit genau dem gleichen Code (Copy & Paste) geschrieben habe geht's. Hat jemand eine Idee?
Die Connection ist zum Startpunkt inaktiv und die Tabelle demnach auch.
|
|
rochus
      
Beiträge: 416
Win XP Prof, Fedora Core 4, SuSE 7.0
D7 Ent, D2005 Pers
|
Verfasst: Mi 21.09.05 10:29
Wie lautet denn die Fehlermeldung?
_________________ Im Nachhinein ist man immer ein Schlauch!
"Dream as if you'll live forever, live as if you'll die today!" James Dean
|
|
Talbot 
      
Beiträge: 44
Win 2000, Win98, WinXP Prof, Linux(Suse, Gentoo, Debian, RedHat)
D6 Enterprise
|
Verfasst: Mi 21.09.05 10:32
Problem schon gelöst!
In der .ini stand folgendes:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| [Connection] Port=12345 [Database] Path=D:\Eigene Dateien\Ausbildung\Abschlussprüfung\Programmierung\dev\serverapp\data\ Filename=EMServer.mdb [Filenames] Logfile=C:\log.txt Transferfile=C:\transfer.xml |
Man beachte die variable "Path". Diese hat einen Trailing slash und in meinem Code wird dieser nochmal hinzugefügt.
Bzw. wurde hinzugefügt. Hab's ja jetzt korrigiert 
|
|
rochus
      
Beiträge: 416
Win XP Prof, Fedora Core 4, SuSE 7.0
D7 Ent, D2005 Pers
|
Verfasst: Mi 21.09.05 10:33
Du kannst das ja ganz einfach über die funktion IncludeTrailingPathDelimiter machen.
_________________ Im Nachhinein ist man immer ein Schlauch!
"Dream as if you'll live forever, live as if you'll die today!" James Dean
|
|
Talbot 
      
Beiträge: 44
Win 2000, Win98, WinXP Prof, Linux(Suse, Gentoo, Debian, RedHat)
D6 Enterprise
|
Verfasst: Mi 21.09.05 10:36
hey cool,
die Funktion kannte ich noch gar nicht
Hab das bisher immer von hand geparsed....
Da kann man mal sehn. danke mal wieder ^^
|
|
|