Programm (Dienst) kann Preferences nicht zuverlässig lesen

Gast #3226885
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 ... ?
Gast #3226920
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.
Gast #3227300
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren