Forum: PC-Programmierung Programm (Dienst) kann Preferences nicht zuverlässig lesen


von Frank (Gast)


Lesenswert?

Ich habe eine RealBasic-Anwendung (RB2012 r2), die per Socket-Server die 
"Telefonate" von GPS-Trackern empfängt und in eine MySQL-Datenbank 
einträgt. Dazu muss das Programm nat. über Voreinstellungen verfügen. 
Desweiteren soll das Programm als Dienst laufen (wird mittels der 
Windows-Software "AlwaysUp" erledigt), damit es auch dann läuft, wenn 
niemand angemeldet ist (Server eben).

Die Voreinstellungen in specialfolder.preferences ablegen geht schon mal 
garnicht, weil dieser ja user-spezifisch ist. Wenn das Programm als 
Dienst läuft, läuft es im System-Kontext und ist für mich nicht sichtbar 
und nicht bedienbar.

Also habe ich die Preferences ohne Pfadangabe (nur Dateiname) mit im 
Programmordner untergebracht. RealBasic-Anwendungen greifen bei 
Dateizugriffen ohne Pfadangabe normalerweise dann auf ihren eigenen 
Ordnerpfad zu. Ich starte das Programm im normalen Usermodus und 
konfiguriere es, danach beende ich es und lasse es von AlwaysUp als 
Dienst starten. Das geht meistens, aber irgendwie nicht immer. In von 
mir nicht vorhersehbaren Abständen kann die App nach einem 
gelegentlichen Neustart des Servers die Prefs nicht finden und hat dann 
natürlich keinen Zugang zur Datenbank.

Ich bin nicht so der Windows-Profi ... gibt es irgend einen Grund, warum 
das Lesen der Pref-Datei ohne Pfadangabe im Dienst-Modus evtl. nicht 
zuverlässig funktioniert?

Die einzige Alternative, die ich sonst noach sehe, wäre ein "fest 
verdrahteter" Pfad z.B. nach C: oder so ... ?

von bluppdidupp (Gast)


Lesenswert?

Dateinamen ohne Pfadangaben beziehen sich auf das Arbeitsverzeichnis, 
das nicht zwangsweise das Programmverzeichnis sein muss (Das 
Arbeitsverzeichnis kann z.B. durch den Prozess-Starter, durch Dinge wie 
"Datei öffnen"-Dialoge, usw. geändert werden)

Besser wäre den korrekten Pfad zur Laufzeit zusammen zu bauen:
In C via WinAPI kann man via
1. GetModuleFileName() den Pfad der .exe holen
2. Darauf noch PathCchRemoveFileSpec() anwenden, um aus dem zuvor 
ermittelten Pfad den Dateinamen rauszuschmeißen
3. Der Programmordner ist nun bekannt und der Dateiname kann einfach 
drangehangen werden

Im .NET-Framework gäbe es das Application.StartupPath-Property, das das 
Programmverzeichnis enthält.

Weitere Alternative wäre (je nach Sicherheitsanforderungen) die 
Konfigurationsdatei in einen Ordner zu packen, auf den von allen Nutzern 
zugegriffen werden kann (z.B.: FOLDERID_ProgramData / 
CSIDL_COMMON_APPDATA). Um in der Anwendung auf die z den IDs gehörenden 
Pfade zu kommen gibt es auch APIs.

von Frank (Gast)


Lesenswert?

Ok, danke. Der hinweis, dass der physikalische App-Pfad nicht unbedingt 
gleich dem Ausführungspfad sein muss, ist wohl der entscheidende. Nach 
etwas Recherche habe ich für Realbasic diese Lösung gefunden:

App.ExecutableFile.Parent.AbsolutePath

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.