Hinzuladen von .ini-Dateien

Anfängerfragen zum Programmieren mit PureBasic.
Tanaghra
Beiträge: 28
Registriert: 13.05.2017 01:44

Hinzuladen von .ini-Dateien

Beitrag von Tanaghra »

Hallo,

ich habe ein Anwendungsprogramm geschrieben, genauer einen Paßwortgenerator, der bei Programmstart eine zweite Datei laden soll, und zwar eine .ini oder .cfg-Datei (Konfigurationsdatei). Das Problem besteht nun darin, daß das Programm auch auf anderen Rechnern laufen soll, die eine ganze Verzeichnisstruktur haben. In meinem Quellkode kann ich eine Konstante wie

#Qkv_Pg="D:\Programmierung\Basic-Programme\PureBasic\Paßwortgenerator\"

festlegen, die dann auf meinem Rechner läuft, auf dem fremden aber mit ziemlicher Sicherheit nicht.
Nun kann ich natürlich einen Datei-öffnen-Dialog programmieren und den "Fremdnutzer" selbst nach der Datei suchen lassen. Das funktioniert dann aber nur bei diesem einen Mal, denn der Pfad zur cfg-Datei des Fremdnutzers wird ja nach Programmende nirgendwo gespeichert, so daß das ganze Spiel beim zweiten Programmstart von vorne losgeht. Wie löst man am besten dieses Problem?

In diesem Zusammenhang noch eine zweite Frage. Ich habe einerseits ein Quellkodeverzeichnis, das beim Kompilieren/Starten sowohl den Quellkode als auch die .cfg-Datei aus diesem Verzeichnis lädt. Andererseits gibt es aber auch noch die fertige, ausführbare exe-Datei, die sich nicht im Quellkodeverzeichnis, sondern ganz woanders befindet. Die exe-Datei soll ihre cfg-Datei natürlich aus ihrem Verzeichnis und nicht aus dem Quellkodeverzeichnis laden.
Wie kann ich das Programm unterscheiden lassen zwischen a) einer Kompilierung für das Debuggen und b) der Erstellung der fertigen .exe-Datei? Im Fall a) soll die cfg-Datei aus dem Quellkodeverzeichnis geladen werden, im Fall b) aus dem Verzeichnis der .exe-Datei.

Vielen Dank
Windows 7 x64; geposteter Kode bezieht sich (sofern nicht anders angegeben) immer auf das aktuellste PureBasic 64-Bit

Erst wenn man es seiner Schwiegermutter erklären kann, hat man es verstanden.
As gsündeste is oiwei guad essn und dringa und ned grang wern.
Jan125
Beiträge: 31
Registriert: 23.06.2013 06:26
Computerausstattung: Nicht lachen. Atom Z3775, 2GiB RAM, Win8.1.

Re: Hinzuladen von .ini-Dateien

Beitrag von Jan125 »

Code: Alles auswählen

CompilerIf #PB_Compiler_Debugger = 1
#Qkv_Pg = {PfadZurDebuggingDotINI}
CompilerElse
#Qkv_Pg = {PfadZurNormalenDotCFG}
CompilerEndIf
Alternativ kannst du auch einen relativen Pfad setzen, z.B. ".\blah.cfg" oder "..\blah.cfg".

Auch den Ordner, wo die .EXE beim Testen ausgeführt wird kannst du verändern.
(Compileroptionen, dann zweiter Reiter... Glaube ich.)


Zur Abspeicherung:
Kannst den Pfad von OpenFileRequester() in ein File im .EXE- Ordner abspeichern und es dann später auslesen.
Wer braucht schon Unicode? PB5.24LTS
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Hinzuladen von .ini-Dateien

Beitrag von ts-soft »

Zur ersten Frage: Ini-Dateien gehören ins "APPDATA" verzeichnis unter Windows, bzw. in HomeVerzeichnis unter Linux, mit nachfolgendem Beispiel Code kannst Du dieses Verzeichnis ermitteln:

Code: Alles auswählen

Procedure.s GetPrefsFile(AppName.s, FileName.s = "settings.prefs", Publisher.s = "ts-soft")
  Protected Path.s, slash.s
  
  CompilerSelect #PB_Compiler_OS
    CompilerCase #PB_OS_Windows
      slash = "\"
      Path = GetEnvironmentVariable("APPDATA") + "\"
    CompilerDefault
      slash = "/"
      Path = GetHomeDirectory() + "."    
  CompilerEndSelect
  If Publisher
    Path + Publisher + slash
    If Not FileSize(Path) = - 2
      CreateDirectory(Path)
    EndIf
  EndIf
  Path + AppName + slash
  If Not FileSize(Path) = - 2
    CreateDirectory(Path)
  EndIf
  If FileSize(Path) = -2
    ProcedureReturn Path + FileName
  EndIf
EndProcedure

Debug GetPrefsFile("Passwortdingens.exe", "meineIni.ini", "Tanaghra")
Zur zweiten Frage:
Am besten in den Einstellungen:
Datei / Einstellungen / Compiler / Standard den Haken bei
- Temporäres Executable im Quellcode-Verzeichnis erstellen
(welches selbstverständlich Beschreibbar sein sollte)

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Bisonte
Beiträge: 2427
Registriert: 01.04.2007 20:18

Re: Hinzuladen von .ini-Dateien

Beitrag von Bisonte »

@TS-Soft: Mittlerweile muss man nicht mehr den Pfad aus den EnvVars lesen....
PB ist gewachsen, und das sogar auf allen OS ;)

Code: Alles auswählen

Debug GetUserDirectory(#PB_Directory_ProgramData)
PureBasic 6.04 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Hinzuladen von .ini-Dateien

Beitrag von ts-soft »

@Bisonte
Danke für den Hinweis :allright:

Ich hatte den Code, bis auf die Debugzeile, sowieso in meinem Baukasten, war also keine Arbeit.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Tanaghra
Beiträge: 28
Registriert: 13.05.2017 01:44

Re: Hinzuladen von .ini-Dateien

Beitrag von Tanaghra »

Hallo,

danke für Eure Antworten. Ich hab 10 Minuten später dann in der Hilfe #PB_Compiler_Debugger entdeckt, der mein (zweites) Problem löst:

Code: Alles auswählen

Define.s ZpfV, PfV="Paßwortgenerator.cfg" ; (Ziel)pfad für Voreinstellungen
If #PB_Compiler_Debugger
  ZpfV=#Qkv+PfV
Else
  ZpfV=GetPathPart(ProgramFilename())+PfV
EndIf
Das ist so ziemlich dasselbe, wie Jan125’s Vorschlag, aber die Ausführungen zu CompilerIf in der Hilfe habe ich nicht wirklich verstanden (was da der Unterschied zu einem 'normalen' If sein soll).
Windows 7 x64; geposteter Kode bezieht sich (sofern nicht anders angegeben) immer auf das aktuellste PureBasic 64-Bit

Erst wenn man es seiner Schwiegermutter erklären kann, hat man es verstanden.
As gsündeste is oiwei guad essn und dringa und ned grang wern.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Hinzuladen von .ini-Dateien

Beitrag von ts-soft »

aber die Ausführungen zu CompilerIf in der Hilfe habe ich nicht wirklich verstanden
Ein CompilerIf wird nur einmal ausgewertet, nämlich beim Compilieren. Es sind also CompilerDirektiven, wobei nur der zutreffende Teil Code erzeugt.

PS: Meine Lösung des zweiten Problems finde ich aber eleganter :D
Es ist auch nur noch dieser Teil, egal ob gedebuggt oder nicht, erforderlich:

Code: Alles auswählen

ZpfV=GetPathPart(ProgramFilename())+PfV
weil das funktioniert dann immer gleich.

PS2: Es ist seit Jahren nicht mehr üblich Einstellungen im Programmverzeichnis zu erstellen. Diese werden unter Windows meist im verstecktem Verzeichnis "APPDATA" bzw. "Anwendungsdaten" erstellt und sind nur dort , ohne Adminrechte, zu beschreiben. Du bekommst entweder eine Fehlermeldung von Windows oder Deine Einstellungen werden heimlich in "VirtualStore" geschrieben und Dein Programm läuft lediglich im Kompatibilität-Modus.

Das ist nicht Windows-Konform und sollte nur noch bei sehr alten Programmen so vorkommen!
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
_JON_
Beiträge: 389
Registriert: 30.03.2010 15:24

Re: Hinzuladen von .ini-Dateien

Beitrag von _JON_ »

ts-soft hat geschrieben:Das ist nicht Windows-Konform und sollte nur noch bei sehr alten Programmen so vorkommen!
Naja, kommt drauf an ob es sich un ein Programm mit Setuproutine oder um ein portables Programm handelt.
Idealerweise macht man es wie z.B. bei Softmaker Office und überlässt es dem Nutzer.

Code: Alles auswählen

Global g_Settingini.s

If FileSize(GetPathPart(ProgramFilename()) + "portable.txt") >= 0
  g_Settingini = GetPathPart(ProgramFilename()) + "setting.ini"
Else
  g_Settingini = GetUserDirectory(#PB_Directory_ProgramData) + "setting.ini"
EndIf
PureBasic 5.46 LTS (Windows x86/x64) | windows 10 x64 Oktober failure
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Hinzuladen von .ini-Dateien

Beitrag von ts-soft »

Ich persönlich mag dieses Umgehen der Sicherheitseinstellungen von Windows überhaupt nicht. Portable Programme sollte immer auch Portable genutzt werden, also niemals installiert ins normale System.

Aber mit diesem Problem hat wohl Microsoft zu kämpfen und nicht ich :lol: und es wird einer der Gründe sein, warum der User bald nichts mehr allein bestimmt :freak:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
udg
Beiträge: 560
Registriert: 20.06.2013 23:27

Re: Hinzuladen von .ini-Dateien

Beitrag von udg »

Weil es um Passwort Generator geht. Ich habe letzte Woche einen portablen geschrieben und ist im Netz unterwegs :)

wen es interessiert:
Direkt-Download von meiner Seite

Bild

aus der NFO:

Kurze Rede langer Sinn.

Passwort Generator? Ja, denn warum soll ich mich jedes mal online auf einer
Internetseite anmelden um ein Passwort zu generieren, wenn ich dieses Tool
meinen Bedürfnissen angepasst, bequem auf dem Desktop ausführen kann?

Der Vorteil:

das Passwort muss nicht erst in die Zwischenablage kopiert werden um es dann lokal
zu speichern weil man es dann doch noch irgendwann braucht.

Das kann auch alles mit 2 Klicks erledigt werden.

Der Passwort Generator generiert zufällig aus Millionen von Möglichkeiten starke Passwörter
in einer Länge von 8 - 30 Zeichen

- Sollte nur das Passwort für eine schnelle Anmeldung benötigt werden, reicht es,
die Anzahl der zu generierenden Zeichen einzugeben (Standard wurde auf 20 gesetzt)
und den Button: generiere Passwort klicken.
- danach den Button: Passwort in Zwischenablage kopieren, klicken

das generierte Passwort befindet sich nun in der Zwischenablage und kann überall
sofort eingefügt werden.

- benötigst Du die generierten Angaben für zukünftige Anmeldungen besitzt der
Passwort Generator die Funktion, alle Informationen schnell in eine Text-Datei zu
speichern
- generiere ein Passwort
- gib im ersten Eingabefeld eine Verwendung, Hinweis ein
- gib im zweiten Eingabefeld den zukünftigen oder bestehenden Benutzername oder
Account ein

klicke abschließend auf den Button: Passwort Informationen speichern

Alle mit Passwort Generator erstellten Informationen werden nun in eine Text Datei gespeichert.
Du hast so, immer deine Informationen zur Hand und musst nichts weiter tippen, schreiben oder
zwischen kopieren.

nice and easy
PB v5.43 LTS + v6.02 LTS | Windows 7 x86 + 11 x64 - Gforce RTX 4090 - AMD Ryzen 9 5900X 12-Core Processor 4.2 GHz - 64,0 GB RAM,
ASUSTEK TUF Gaming X570 Plus
ASUS ROG Thor-1200P Platinum (1200W, Aura Sync, OLED Display, 0dB-Cooling)
1x 1 TByte Samsung MZ-V7S500BW 970 EVO Plus 1 TB NVMe M.2 Internal SSD
1x 2 TByte Samsung MZ-V7S2T0BW 970 EVO Plus 2 TB NVMe M.2 Internal SSD
von BiSONTE! TOP. Kauft Eure Hardware gern bei ihm.
Monitor:
LG 38GL950G-B 95 (38 Zoll) Ultragear Curved 21: 9 UltraWide QHD IPS
Antworten