![]() |
Service-Anwendung und assignfile
Hi,
hab mich mal an einer Service-Anwendung versucht und stehe vor folgendem Problem: Versuche eine normale Textdatei zu öffnen und daraus zu lesen:
Delphi-Quellcode:
die test.txt existiert natürlich im gleichen Verzeichnis wie die Anwendung. Der Service beendet sich, wenn dieser Code vorkommt.
assignfile(f,'test.txt');
reset(f); // sonstiger code closefile(f); Auch den kompletten Pfad wie z.B. c:\test.txt nimmt er nicht. Wenn ich allerdings eine neue Datei anlege mit
Delphi-Quellcode:
dann funktioniert alles ohne Probleme.
assignfile(f,'test.txt');
rewrite(f); // sonstiger code closefile(f); Jemand ne Idee? Gruß speedy |
AW: Service-Anwendung und assignfile
klingt nach einem Rechteproblem, wobei ich mich nicht auf den Pfad der Anwendung verlassen würde, auf "C:\datei.ext" darf ein Normaluser seit Vista auch nicht mehr ohne weiteres.
|
AW: Service-Anwendung und assignfile
Unter welchem Nutzer läuft den der Dienst?
|
AW: Service-Anwendung und assignfile
Der Dienst läuft laut Taskmanager als System.
|
AW: Service-Anwendung und assignfile
Und?mhat deas Benutzerkonto System die nötigen Zugriffsrechte?
|
AW: Service-Anwendung und assignfile
Windows sagt mir zumindest in den erweiterten Sicherheitseinstellungen der entsprechenden EXE, dass das System Vollzugriff hat, oder gibts da noch irgendwo ne andere Möglichkeit die Rechte des System Accounts zu ändern? In den Konteneinstellungen wird System ja gar nicht erst angezeigt.
|
AW: Service-Anwendung und assignfile
Nimm doch testweise einen unpreviligierten Ordner mit einem harten Pfad der exisistiert (z.B. C:\test\test.txt).
Ändere den Dienstaccount versuchsweise auf ein Administratives Konto. Versuche die Fehlermeldung abzugreifen (GetLasterror), oder zu debuggen (hierbei ist es hilfreich ein Sleep(10000)) am Anfang einzubauen und nach dem Dienststart in Delphi "mit Prozess verbinden aufzurufen" |
AW: Service-Anwendung und assignfile
Zitat:
|
AW: Service-Anwendung und assignfile
Warum fängst du an der Stelle nicht mal die Exception ab?
(dann würde sich dein Service auch nicht ins Nirwana verabschieden) Hängt allerdings auch von dem Compilerschalter
Delphi-Quellcode:
ab
{$I+}
![]()
Delphi-Quellcode:
Ansonsten würde ich immer folgendes Konstrukt vorschlagen:
assignfile(f,'test.txt');
try reset(f); // sonstiger code except on E: Exception do SchreibInMeinLog( E.Message ); end; closefile(f);
Delphi-Quellcode:
assignfile( f, 'test.txt' ); // Zu sehen wie ein Object := TObject.Create
try {$I-} reset( f ); {$I+} if IOResult = 0 then begin // sonstiger code end; finally closefile( f ); // Zu sehen wie ein Object.Free end; |
AW: Service-Anwendung und assignfile
wobei spätestens hier das nächste Problem auftreten wird.:wink:
Delphi-Quellcode:
SchreibInMeinLog
|
AW: Service-Anwendung und assignfile
Okay ;)
Das schau ich mir morgen mal genauer an wie das mit Service-Anwendung debuggen funktioniert. Ist das erste Mal, dass ich mich an nem Dienst versuche... |
AW: Service-Anwendung und assignfile
Zitat:
Zitat:
|
AW: Service-Anwendung und assignfile
Der else-Zweig mit der Fehlerbhandlung fehlt bei dir noch, sonst macht es keinen Sinn.
|
AW: Service-Anwendung und assignfile
@Sir Rufo
sorry, hatte ich übersehen... |
AW: Service-Anwendung und assignfile
Zitat:
|
AW: Service-Anwendung und assignfile
Wir wollen doch wissen, warum es nicht klappt.
|
AW: Service-Anwendung und assignfile
Zitat:
Die weitere Ausschmückung bleibt jedem selber überlassen. Generell würde ich einfach nur das AssignFile/CloseFile wie Object := TObject.Create/Object.Free immer in einem try..finally Block einschliessen. Sozusagen die Basic-Rules, ähnlich wie Zitat:
|
AW: Service-Anwendung und assignfile
So, habs hinbekommen den Debugger laufen zu lassen... :stupid:
"Im Projekt Project1.exe ist eine Exception der Klasse EInOutError mit der Meldung 'Datei nicht gefunden' aufgetreten." Die Datei ist aber zweifelsfrei im gleichen Pfad wie die .exe vorhanden. Pfad des Projekts ist hierbei in einem Unterordner von Dokumente des aktuellen Benutzers (Admin Account unter Win7 x64). Der Dienst läuft hierbei als Localsystem. Mit einem absoluten Pfad z.B. c:\test.txt funktionierts jetzt plötzlich. Keine Ahnung warum, aber gestern ging es auch damit nicht. Frage wäre jetzt noch warum Windows die Datei nicht findet, wenn eben kein absoluter Pfad angegeben wird... |
AW: Service-Anwendung und assignfile
Weil relative Pfade relativ zum Arbeitsverzeichnis sind, welches nicht unbedingt das Verzeichnis sein muss, in dem die Exe liegt. Deshalb realtive Pfade dynamisch als vollständige absolute Pfade zusammensetzen
|
AW: Service-Anwendung und assignfile
Schau dir mal Windows-Verknüpfungen an. Dort gibt es unter Eigenschaften ein Feld namens "Ausführen in:". Damit kannst du den lokalen Kontext, also den Ort an dem die Exe ausgeführt wird einstellen. D.h. nicht jede Anwendung muss in dem Verzeichnis ausgeführt sein, indem Sie liegt. Somit sind relative Pfade immer mit Vorsicht zu genießen.
-- EDIT1: No red box... -- EDIT2: Vielleicht hilft dir ja
Delphi-Quellcode:
weiter. Das sollte dir den Pfad liefern, in dem die Exe-Datei liegt.
ExtractFilePath(Application.ExeName)
|
AW: Service-Anwendung und assignfile
Zitat:
Nimm, doch einen sinnvollen Ordner und wenn Anwendung und Datei im gleichen Ordner liegen müssen greife per ExtractFilePath(Application.Exename)+'wieauchimmer .txt' zu. |
AW: Service-Anwendung und assignfile
Über leg doch mal. Du steht in einer Bibliothek, in der du dich nicht auskennst, und sollst ein Buch holen. Sagen wir das Buch "Raise and Fall of the Roman Empire". Wenn dir jemand sagt: "Gehe in Raum 3, Abteilung 5, Regal 11, unterstes Regalbrett, dritte Buch von links: "Raise and Fall of the Roman Empire". Wie wirst du das Buch eher finden, wenn du nicht zufällig genau davor stehst, nur alleine mit dem Titel oder mit der kompletten Angabe wo das Buch steht? Genauso geht es Windows auch. Wenn das Arbeitsverzeichnis nicht zufällig, das Verzeichnis mit der gewünschten Datei ist, wird Windows die Datei nicht finden.
Und dass das gestern nicht geklappt hat, könnte an einem anderen Fehler im Programm gelegen haben. PS: Mir ist leider kein passender Autoindustrievergleich eingefallen. ;) |
AW: Service-Anwendung und assignfile
Oder
Delphi-Quellcode:
, dann wird die Unit Forms nicht benötigt (Application.Exename verwendet ParamStr(0))
ParamStr(0)
|
AW: Service-Anwendung und assignfile
Alles klar ;)
Danke! |
AW: Service-Anwendung und assignfile
Zitat:
Ich würde auf
Delphi-Quellcode:
verzichten und dafür
Application.Exename
Delphi-Quellcode:
verwenden. Für den Zugriff auf
ParamStr( 0 )
Delphi-Quellcode:
benötigt man die Unit Forms und die hat gerade in einer Service-Anwendung nun gar nichts verloren ;)
Application
Weiterhin würde ich generell in das Programmverzeichnis nicht schreibend zugreifen (Ausnahme bei der Installation). Abgesehen davon, dass das meistens eh nicht geht (fehlende Rechte) finde ich es als äusserst störend bei einer Deinstallation noch Dateileichen vorzufinden, weil der Uninstaller per Default dass Programmverzeichnis nur dann löscht, wenn es leer ist. Es gibt schließlich genug Verzeichnisse, die dafür vorgesehen sind und wo ich auch weiß, aha, Programm ist weg, will ich nicht mehr, dann können die Daten auch weg. |
AW: Service-Anwendung und assignfile
Zitat:
![]() |
AW: Service-Anwendung und assignfile
Zitat:
|
AW: Service-Anwendung und assignfile
Stimmt, ganz so deutlich habe ich das nicht erwähnt
|
AW: Service-Anwendung und assignfile
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:47 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz