AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Windows Dienst + relative Pfadangaben
Thema durchsuchen
Ansicht
Themen-Optionen

Windows Dienst + relative Pfadangaben

Ein Thema von hirnstroem · begonnen am 9. Aug 2007 · letzter Beitrag vom 10. Aug 2007
Antwort Antwort
hirnstroem

Registriert seit: 21. Sep 2005
297 Beiträge
 
Delphi 2006 Professional
 
#1

Windows Dienst + relative Pfadangaben

  Alt 9. Aug 2007, 12:39
'loha Folks,

ich arbeite an einem Projekt, welches in drei verschiedenen Varianten erhältlich sein soll. Als Standalone Executable, als Windows Service und als ISAPI Extension.

Nun entwickle und teste ich das ganze seit einem Weilchen als Standalone Variante (die Unterschiede im Quellcode sind ausschliesslich in den jeweiligen DPR-Dateien zu finden).

Die Applikation empfängt nun ständig Bilddaten von Geräten welche an einem CAN-Bus hängen, diese möchte ich über relative Pfade abspeichern. Dabei wird zum einen der Verweis zu der Datei in einer Datenbank abgelegt und das Bild dann auch unter diesem Pfad abgespeichert. Beim betrachten des jeweiligen Datensatzes wird das Bild wieder geladen.

Nun ist es so, dass dies bei der Standalone Variante problemlos funktioniert. Der Dienst hingegen speichert die Dateien im Windows System Verzeichnis ab, was etwas unschön ist.

Ein Pfad sieht so aus:

.\Log/2007/08/09/13_16_06_Addr_30_KEY.bmp

Ist es nun möglich dem Dienst beizubringen, dass er die Daten wie gewünscht im Stammverzeichnis - also dort wo der Dienst sich befindet - abzuspeichern? Oder muss ich einen Workaround mit "ExtractFilePath" oder etwas in dieser Art einrichten? Oder kann man eventuell sogar dem Dienst angeben wo er zu Suchen hat, Falls relative Pfadangaben eingesetzt werden (ähnlich wie bei Verknüpfungen die "Ausführen in" Eigenschaft)?

Grüsse
hirnstroem
inde deus abest
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Windows Dienst + relative Pfadangaben

  Alt 9. Aug 2007, 12:46
es spricht nichts gegen relative Pfade. Du musst dir eben nur klar werden worauf du den realtiven Pfad beziehst. Derzeit beziehst du ihn wahrscheinlich auf das Arbeitsverzeichnis welches bei der Standalone Variante in deinem Testfall das Anwendungsverzeichnis ist. Sinnvoller wäre es aber den Pfad gleich auf das Anwendungsverzeichnis zu beziehen.
Dich hindert auch niemand daran aus dem relativen Pfad zur Laufzeit selbst einen absoluten zu machen (macht Windows sonst selbst anhand des Arbeitsverzeichnisses).
Oder das aller beste - speichere es in einen Pfad wo auch Schreibrechte vorhanden sind. Der normale Nutzer hat seit NT (mit NTFS) keine schreibrechte auf den Programme-Ordner und somit sollte da vom Programm auch nichts geschrieben werden.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
hirnstroem

Registriert seit: 21. Sep 2005
297 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Windows Dienst + relative Pfadangaben

  Alt 9. Aug 2007, 13:15
Okay, also Administratorenrechte sind für den Programmstart pflicht, dann sollte das Schreiben auch kein Problem sein.

Sehr sinnvoll ist es nicht Daten im Programmverzeichnis aufzuzeichnen, gewünscht wird es aber trotzdem -.-

Nun verwirrt mich das ganze aber noch immer.

Der Pfad, unter welchem die Bilder abgespeichert werden sollen ist über die Benutzeroberfläche konfigurierbar. Relative und absolute Pfade werden dabei beide akzeptiert. Im einen Fall wird das Bild folgendermassen abgespeichert (relativer Pfad):
imgReceived.Picture.Bitmap.SaveToFile('.\Log\2007\08\09\13_16_06_Addr_30_KEY.bmp'); Mit absoluten Pfaden könnte das dann so ausschauen:
imgReceived.Picture.Bitmap.SaveToFile('C:Programme\Programm\Log\2007\08\09\13_16_06_Addr_30_KEY.bmp'); Genau diese Strings werden auch in der Datenbank abgespeichert.

Beim Laden des Bildes sähe dies dann so aus:

imgKey.Picture.LoadFromFile('.\Log\2007\08\09\13_16_06_Addr_30_KEY.bmp'); beziehungsweise:

imgKey.Picture.LoadFromFile('C:Programme\Programm\Log\2007\08\09\13_16_06_Addr_30_KEY.bmp'); Ich ging davon aus dass der relative Pfad stets die Wurzel dort hat, wo die Applikation liegt. Beim Dienst ist dies aber scheinbar das System Verzeichnis. Wie dies umgebogen werden kann ist mir noch immer schleierhaft.

Grüsse
hirnstroem
inde deus abest
  Mit Zitat antworten Zitat
Benutzerbild von thkerkmann
thkerkmann

Registriert seit: 7. Jan 2006
Ort: Pulheim Brauweiler
464 Beiträge
 
Delphi 2010 Professional
 
#4

Re: Windows Dienst + relative Pfadangaben

  Alt 9. Aug 2007, 13:23
Zitat von hirnstroem:
Ich ging davon aus dass der relative Pfad stets die Wurzel dort hat, wo die Applikation liegt. Beim Dienst ist dies aber scheinbar das System Verzeichnis. Wie dies umgebogen werden kann ist mir noch immer schleierhaft.

Grüsse
hirnstroem
Hi,

musst du ja nicht unbedingt umbiegen,
aber Du kannst mit Hilfe von z.B.
Delphi-Quellcode:
function GetModuleName: string;
var
  ModName: array[0..MAX_PATH] of Char;
begin
  SetString(Result, ModName,
    Windows.GetModuleFileName(HInstance, ModName, SizeOf(ModName)));
end;
Dir im Service den Pfad der Anwendung holen, mit

ExtraxtFilePath (GetModuleName) abschneiden - und vor deine relativen Pfadangaben setzen.

Gruss
Thomas Kerkmann
Ich hab noch einen Koffer in Borland.
http://thomaskerkmann.wordpress.com/
  Mit Zitat antworten Zitat
hirnstroem

Registriert seit: 21. Sep 2005
297 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Windows Dienst + relative Pfadangaben

  Alt 9. Aug 2007, 13:44
Langsam dämmert es, oder es ist sogar schon hell.

Im Endeffekt müssen also alle Bilder über absolute Pfade abgespeichert werden, so einfach wäre es. Irgendwie habe ich aber den Verdacht, dass die wieder zu neuen Problemen führen wird.

Angenommen, die Bilder werden im Programmverzeichnis und mit absoluten Pfaden gespeichert (was vielleicht unschön aber trotzdem möglich ist). Nun wird der Programmordner verschoben und alte Daten sind dann plötzlich nicht mehr erreichbar. Mit relativen Pfaden hätte man dies schön umgehen können, da die Bilder ja mitverschoben würden und noch immer an demselben Ort erreichbar wären.

Bis jetzt wurden absolute Pfade nicht angenommen, wenn der gewählte Ordner sich im Programmverzeichnis befindet (um genau dieses Problem zu umgehen). Wenn die Bilder ausserhalb des Programmverzeichnisses gespeichert werden, sind wiederum relative Pfade Pflicht. So kann der Ordner in welchem sich die Applikation befindet nach belieben verschoben werden. Diese Abhängigkeiten sind mir irgendwie noch wichtig.


Abspeichern im Service sollte also genau mit folgender Zeile möglich sein:

imgReceived.Picture.Bitmap.SaveToFile('.\Log\2007\08\09\13_16_06_Addr_30_KEY.bmp');
inde deus abest
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Windows Dienst + relative Pfadangaben

  Alt 9. Aug 2007, 14:06
du kannst ja den relativen Pfad speichern. Aber für den aufruf von SaveToFile solltest du den relativen Pfad zu einem absoluten Pfad machen:
Delphi-Quellcode:
lPath := '.\datei.txt';
if (copy(lPath, 1, 2) = '.\') then
  lPath := ExtractFileName(Application.ExeName) + copy(lPath, 3, Length(lPath));
SaveToFile(lPath);
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
hirnstroem

Registriert seit: 21. Sep 2005
297 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Windows Dienst + relative Pfadangaben

  Alt 9. Aug 2007, 14:23
Das macht Sinn.

Vielen Dank für die Hilfe!

Grüsse
hirnstroem
inde deus abest
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#8

Re: Windows Dienst + relative Pfadangaben

  Alt 9. Aug 2007, 15:33
Moin Hirnstroem,

warum nimmst Du nicht einfach einen Pfad, der immer vorhanden sein sollte, und wo solche Daten dann auch hingehören, z.b. unterhalb von "All Users\Anwendungsdaten"
Die Basis dafür kannst Du dann mit SHGetspecialFolderPath auslesen.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
hirnstroem

Registriert seit: 21. Sep 2005
297 Beiträge
 
Delphi 2006 Professional
 
#9

Re: Windows Dienst + relative Pfadangaben

  Alt 10. Aug 2007, 06:05
'loha Christian,

das ist eben so eine Geschichte. Auf jeden Fall wird gewünscht, die Daten überall abspeichern zu können. Je nach Einsatzgebiet und der Anzahl Geräte welche Bilder schicken - und das können theoretisch tausende sein - ist dann auch die Datenmenge relativ gross. Es handelt sich bei dem Ganzen um ein flexibles Zutrittskontrollsystem. Bei beispielweise 200 Leuten, welche 10 Mal pro Tag eine Türe öffnen beläuft sich das schon auf mehrere hundert Gigabyte pro Jahr. Diese werden wohl vorzugsweise auf einem Datenserver abgelegt oder wo auch immer. Für Anwendungsfälle mit kleinerem Umfang ist dies nicht nötig und da könnte es dann auch Sinn machen die aufgezeichneten Daten im Programmverzeichnis zu behalten. Die Daten werden aus Datenschutzgründen dann auch wieder gelöscht nach einer Weile.

Auf jeden Fall klappt das Speichern und Laden der Bilder jetzt wie gewünscht und die Vorgaben konnten eingehalten werden.

Grüsse
hirnstroem
inde deus abest
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#10

Re: Windows Dienst + relative Pfadangaben

  Alt 10. Aug 2007, 10:17
Moin Hirnstroem,

dann könntest Du es noch konfigurierbar machen, und den Speicherpfad in der Registry eintragen (HKLM\Software).
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:55 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz