Seite 1 von 2
32-64-Bit Compilierung
Verfasst: 11.01.2016 15:50
von Velindos
Hallo Leute,
in meinen Programm speichere ich temporär auf der C-Platte ab. Dies funktioniert wenn ich das Programm in 32-Bit kompiliere!
Wenn ich das Programm in 64-Bit kompiliere, dann kann ich die Datei nicht mehr auf dem Laufwerk C:\ speichern! Anscheinend bekomme ich keine Rechte, obwohl der selbe Code unter 32-Bit läuft!
Mal ein Stück Code:
Code: Alles auswählen
[code]
Procedure Datenbank_UpLoad_Stichwort()
Protected file = 0
OpenFile(file, "C:\VelindosStichwort.txt")
WriteString(file, "Mein Teststring")
CloseFile(file)
EndProcedure
Procedure Datenbank_DownLoad_Stichwort()
Protected fileName$ = "C:\VelindosStichwort.txt"
Protected FileInputString$
Protected file = OpenFile(#PB_Any , fileName$)
While Eof(file) = 0
FileInputString$ = ReadString(file)
Wend
CloseFile(file)
SetWindowTitle(0,FileInputString$)
EndProcedure
If OpenWindow(0, 0, 0, 300, 300, "")
Datenbank_UpLoad_Stichwort()
Datenbank_DownLoad_Stichwort()
Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
[/code]
Kann mal jemand sagen warum?
Gruss ... Velindos
Re: 32-64-Bit Compilierung
Verfasst: 11.01.2016 17:05
von Kukulkan
Hallo,
An PB wird das fehlende Recht sicher nicht liegen

Ich vermute dass dein Windows mit 32 Bit andere Einstellungen hat als dein Windows mit 64 Bit.
Grundsätzlich ist es ganz schlecht direkt nach C:\ zu speichern. Hier hat ein Nutzer normalerweise sowieso kein Schreibrecht. Für temporäre Daten speichert man nach %TEMP%. Den Pfad bekommst Du in PureBasic mittels GetTemporaryDirectory().
Wenn es Nutzerdaten sind, speichert man in das Home-Verzeichnis des Nutzers: GetHomeDirectory()
Und wenn das auch nicht gut ist, sollte man den Nutzer mittels PathRequester() fragen wo er es denn haben möchte. Und wenn das schreiben fehlschlägt, gibt man eine Meldung aus vom Typ: "Bitte ein Verzeichnis wählen in dem Sie Schreibrechte besitzen".
Kukulkan
Re: 32-64-Bit Compilierung
Verfasst: 11.01.2016 18:05
von Velindos
Hallo,
danke für den TIP, funzt jetzt!
Gruss ... Velindos
Re: 32-64-Bit Compilierung
Verfasst: 18.01.2016 00:02
von GPI
Kukulkan hat geschrieben:Wenn es Nutzerdaten sind, speichert man in das Home-Verzeichnis des Nutzers: GetHomeDirectory()
Leider ist das nicht ganz richtig. Direkt in Homeverzeichnis Daten abzulegen oder Ordner anzulegen ist unter Windows zwar nicht verboten - aber von MS definitiv nicht der vorhergesehene Weg.
Wie man korrekt den ProgramData-Ordner für alle Betriebsysteme abfragt:
https://github.com/GPIforGit/PureBasic- ... tories.pbi
Re: 32-64-Bit Compilierung
Verfasst: 18.01.2016 00:25
von Bisonte
Unter Windows gelangt man mit GetHomeDirectory() in den richtigen Ordner des Users. Von dort aus noch nach -> AppData\Roaming\ und dort ist dann
der "Microsoft way to save user data".
GetHomeDirectory() hat bei mir bisher noch nie unter Windows versagt.
Re: 32-64-Bit Compilierung
Verfasst: 18.01.2016 01:04
von GPI
Bisonte hat geschrieben:Unter Windows gelangt man mit GetHomeDirectory() in den richtigen Ordner des Users. Von dort aus noch nach -> AppData\Roaming\ und dort ist dann
der "Microsoft way to save user data".
GetHomeDirectory() hat bei mir bisher noch nie unter Windows versagt.
Eben, du musst in unterordner gehen. Bei Linux gibts diese nicht. Von daher ist die Funktion eigentlich schon mal falsch. Bzw. es werden mehr Funktionen benötigt, für Eigene Dateien, Musik, Fotos usw. die gibts mittlerweile bei sämtlichen Betriebsystemen und liegen überall woanders.
Und mit festen Ordnern würde ich aufpassen. AppData\Roming kann sich mal ändern. Ist ja in der Vergangenheit ja oft genug passiert (wenn man sich bspw. anschaut, wo Win95 seine Daten abgelegt hat). Die sicherste Methode ist es mit der Windows-API die Ordner abzufragen. XP gibts den Ordner imo auch nicht - wobei da mein Code auch versagt, weil ich die aktuellen Versionen ab Vista benutze (um auch die anderen Ordner abzufragen).
Wenn man was bspw. in eigene Dokumente ablegen will, das kann jeder User ohne Probleme verschieben. Geht da unter Eigenschaften des Ordners. Wenn man eine kleine SSD hat, macht es Sinn diese Daten auszulagern.
Re: 32-64-Bit Compilierung
Verfasst: 18.01.2016 13:13
von Bisonte
@GPI:
Nur Windows : Wenn ich nun dem User die Möglichkeit gebe, per FileRequester den Pfad zu den Einstellungen eines Programmes
selbst auszuwählen... Wo speichere ich das, damit mein Programm den angegebenen Pfad auch wiederfindet ?
Also einen fixen Ordner muss es geben und unter Windows (Vista/7/8/8.1/10) ist es nunmal "AppData\Roaming\".
Das mit der kleinen SSD und Dokumente/Bilder usw. verschieben ist auch in Ordnung, allerdings nicht den Roaming Ordner.
Oder hast Du es geschafft, den AppData Ordner woanders hin auszulagern ohne das es Probleme gibt (Es soll ja funktionieren laut MS) ?
Ich definitiv nicht, weil sich kaum ein Programmierer um den Microsoft way schert. Und damit meine ich grosse Hersteller wie z.B.
Adobe oder sogar ... unglaublich aber wahr.... Microsoft selbst !
Zum Testen kannst du mal den AppData Ordner verschieben und danach versuchen Office zu starten .... Viel Spass
Aber hier ging es eigentlich um temporäre Dateien und da ist (egal welches Betriebssystem) GetTemporaryDirectory() das richtige.
Re: 32-64-Bit Compilierung
Verfasst: 18.01.2016 13:42
von RSBasic
Bisonte hat geschrieben:Nur Windows : Wenn ich nun dem User die Möglichkeit gebe, per FileRequester den Pfad zu den Einstellungen eines Programmes
selbst auszuwählen... Wo speichere ich das, damit mein Programm den angegebenen Pfad auch wiederfindet ?
Ich bin zwar nicht GPI, aber ich hoffe, ich darf trotzdem darauf antworten.
Entweder im AppData oder wenn es eine Portable-Version ist, dann im eigenen Programmverzeichnis.
Bisonte hat geschrieben:Zum Testen kannst du mal den AppData Ordner verschieben und danach versuchen Office zu starten .... Viel Spass

Du kannst aber versuchen, ein symbolisches Verzeichnis zu erstellen. Dann sollten eigentlich soweit ich weiß alle Dateioperationen weitergeleitet werden.
\\Edit:
Ich habs grad getestet. Funktioniert.
Beispielcode:
http://www.rsbasic.de/aktualisierung/wi ... stellen.pb
Re: 32-64-Bit Compilierung
Verfasst: 18.01.2016 20:07
von Bisonte
RSBasic hat geschrieben:Ich bin zwar nicht GPI, aber ich hoffe, ich darf trotzdem darauf antworten.
Entweder im AppData oder wenn es eine Portable-Version ist, dann im eigenen Programmverzeichnis.
Klar doch, aber Ich hatte diese Frage ja selbst schon beantwortet ...
Aber das mit dem Symbol Links steht bei Microsoft nirgends. Daher ist es immer spassig wenn (bei uns im Laden)
ein Kunde vorbeikommt, mit genau dem Vorgehen wie dort beschrieben.
Re: 32-64-Bit Compilierung
Verfasst: 19.01.2016 01:17
von GPI
Bisonte hat geschrieben:@GPI:
Nur Windows : Wenn ich nun dem User die Möglichkeit gebe, per FileRequester den Pfad zu den Einstellungen eines Programmes
selbst auszuwählen... Wo speichere ich das, damit mein Programm den angegebenen Pfad auch wiederfindet ?
Schwer zu sagen. Viele lösen sowas über einen Parameter, den man in der Verknüpfung angeben kann (Wie bei PB-IDE). Wenn das Programm über einen Installer installiert wird, sollte man bedenken, dass das eigene Verzeichnis durchaus schreibgeschützt sein kann. Da sollte man nicht einfach was abspeichern. Andere Programme (Dolphin-Emulator) speichern in eigene Dokumente (Darum hab ich da einen Ornder !Dokumente wo ich meine tatsächlichen Dokumente abspeichere, viel zu viele Programme haben diese Unsitte) - außer in eigenen Verzeichnis ist eine portable.txt - dann speichert der Emulator in eigenen Verzeichnis. Ich würde es mittels Parameter lösen und einen Link beilegen, wo der gesetzt ist.
Also einen fixen Ordner muss es geben und unter Windows (Vista/7/8/8.1/10) ist es nunmal "AppData\Roaming\".
Denkfehler - gewaltiger sogar. Wenn du die verschiedenen Windows-Versionen anschaust - der Ordner wurde schon mehrmals umbenannt. Unter 95 war er woanders als bei XP und ab Vista hat er sich auch geändert. Siehe hier:
https://en.wikipedia.org/wiki/Special_folder Hinzu kommen noch lokalisierungen. Bei Win95 hies der Ordner in deutschen "Programme" - in englischen "Program files" - viele Programme wollte sich hier im falschen Ordner installieren.
Es ist nicht auszuschließen, das der Ordner bei einer zukünftigen Windows-Version wieder woanders landet. Willst du ernsthaft jedes mal deine Programme anpassen? Mit unzähligen IFs?
Nutz besser die Betriebsystemroutinen zum abfragen der Ordner. Damit bist du auf der sicheren Seite. Wenn ein Win95-Programm das macht, dann speichert es seine Daten selbst unter Win10 in korrekten Ordner.
Das ist imo die hohe Kunst des Programmierens - so zu schreiben, das es auch in Zukunft noch läuft.