Autor Beitrag
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8535
Erhaltene Danke: 473

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Mi 12.05.10 21:19 
Ich möchte den "Programme"-Ordner unter Windows herausfinden. Das klappt - wenn auch veraltet - mit diesen GetShellFolder-CSIDL-Gedöns. Findet man jede Menge zu im Forum, das meiste kommt am Ende irgendwie immer von Luckie.

Jetzt möchte ich das auch unter 64Bit-Windows machen. Da klappt das auch.

Aber: Ich möchte zusätzlich mit meiner 32-Bit-Exe den 64-Bit-Programme-Ordner finden. Also nicht nur "C:\Program Files (x86)" sondern auch "C:\Program Files". Das geht damit nicht.

Jetzt hab ich was gesucht, und bin über SHGetKnownFolderPath auf diese Unit gestoßen, die für "FOLDERID_ProgramFilesX64" was von einem ungültigen Token faselt. Also zurück zu MSDN, und mir über OpenProcessToken(GetCurrentProcess, TOKEN_QUERY or TOKEN_IMPERSONATE, TokenHandle) das 0-Token durch was anständiges ersetzt, bekomme als LastError nun ein "Der Vorgang wurde erfolgreich abgeschlossen" und einen leeren String für mein 64-Bit-Programmverzeichnis. :autsch:

Der Rückgabewert 0x80070002 von ShGetKnownFolderPath hat mich dann dahin geführt, wo als Lösung das auslesen aus der Registry steht. Aber das kann es doch nicht sein, oder?

Irgendjemand ne Idee dazu?

_________________
We are, we were and will not be.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 12.05.10 21:23 
Ich übernehme keine Haftung!

Du kannst die Virtualisierung ausschalten für dein Programm. Leider kann ich dir nicht genau sagen wie das geht. Entweder geht das schon über ein entsprechendes Manifest oder über eine API-Funktion. Die Suche sollte dir aber schnell weiterhelfen.
Gausi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8535
Erhaltene Danke: 473

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Mi 12.05.10 21:30 
Hm, das würde ich lieber bleiben lassen - das hat doch bestimmt noch irgendwelche Nebenwirkungen, oder?

Ich brauche das eigentlich nur um festzustellen, ob sich das Programm in diesem Verzeichnis befindet, um entscheiden zu können, ob ich die Konfigurations-Dateien im Programmverzeichnis speichere (portable Version) oder korrekt im Anwendungsdaten-Verzeichnis des Users.
Wenn der User nun auf die Idee kommt, und das Programm ins 64-Bit-Programm-Verzeichnis zu "installieren", wird auf Grund fehlender Schreibrechte gar nichts gespeichert, und das ist unschön.

_________________
We are, we were and will not be.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 12.05.10 21:34 
Ich bin mir nicht sicher, aber die Deaktivierung müsste nur für den Prozess gelten und so habe ich es auch geschrieben: "für dein Programm". Sollte also kein Problem darstellen.
Tryer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 226
Erhaltene Danke: 7



BeitragVerfasst: Mi 12.05.10 21:55 
Hier ist das mit dem "Alternate Registry View" offiziell beschrieben.
Und hier ist der passende GUID genannt, vielleicht kommt man damit weiter.. :nixweiss:

Grüsse, Dirk
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 12.05.10 22:09 
Es gibt zwei Möglichkeiten: Die komplizierte über die Deaktivierung der Umleitungen für den aktuellen Thread oder die einfache wie es gedacht ist. Ich bevorzuge die letztere. :mrgreen:

Lies einfach mit GetEnvironmentVariable die Umgebungsvariable ProgramW6432 aus. Wenn sie existiert, dann ist es ein 64-Bit Windows (sonst bekommst du nen leeren String zurück). Dadrin steht der Pfad zum echten c:\program files, während in der Variable ProgramFiles das x86 Verzeichnis c:\program files (x86) steckt (und unter 32-Bit steht dort natürlich das normale drin).

Trotzdem bin ich weiter für meine Methode einfach den Benutzer zu fragen und beim Start automatisch die Einstellungen zu suchen, egal wo die gespeichert sind. :mrgreen:
Gausi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8535
Erhaltene Danke: 473

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Mi 12.05.10 22:21 
Na toll. Da wollte ich grade schreiben, dass ich das jetzt grade gefunden habe, und dann kommt da so ein orangener Kasten... :motz:

Ja, damit geht das erschreckend einfach. :lol:

@deine Methode: kann man machen, ja. Aber das gibt dann auch Probleme beim Start von CD. Dann wird entweder direkt das User-Verzeichnis am (Gast-)Rechner vollgemüllt, oder die Abfrage kommt bei jedem Start. Hat beides Vor- und nachteile, finde ich. ;-)

_________________
We are, we were and will not be.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 12.05.10 22:24 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Lies einfach mit GetEnvironmentVariable die Umgebungsvariable ProgramW6432 aus. Wenn sie existiert, dann ist es ein 64-Bit Windows (sonst bekommst du nen leeren String zurück).

Das will er ja gar nicht. Er will wissen, ob unter einem 64-Bit Windows sein 32-Bit Programm im 32 oder 64 Bit Programmeordner liegt, wenn ich ihn richtig verstanden habe.
Gausi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8535
Erhaltene Danke: 473

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Mi 12.05.10 22:27 
Richtig, und genau das kann man damit feststellen.
ausblenden Delphi-Quelltext
1:
2:
p1 := GetEnvironmentVariable('ProgramW6432');
p2 := GetEnvironmentVariable('ProgramFiles');
liefert bei einer 32-Bit-Exe auf einem 64-Bit-System beide Programme-Order. :D

_________________
We are, we were and will not be.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 12.05.10 22:31 
user profile iconGausi hat folgendes geschrieben Zum zitierten Posting springen:
Hat beides Vor- und nachteile, finde ich. ;-)
War auch nicht wirklich ernst gemeint, das Thema hatten wir ja schon. ;-)

// EDIT:
Du kennst ja vielleicht das Zitat:
Cato hat folgendes geschrieben:
Ceterum censeo Carthaginem esse delendam
:mrgreen: :P
Gausi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8535
Erhaltene Danke: 473

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Mi 12.05.10 22:37 
Kann gut sein, dass wir das schonmal hatten, ja. ;-)

Cato hat folgendes geschrieben:
Ceterum censeo Carthaginem esse delendam

Immer auf die armen Carthager. :bawling:

_________________
We are, we were and will not be.