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 ... ?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.