Autor |
Beitrag |
Gausi
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: 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.
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
|
Verfasst: 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 
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: 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
|
Verfasst: 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
      
Beiträge: 226
Erhaltene Danke: 7
|
Verfasst: 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..
Grüsse, Dirk
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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.
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. 
|
|
Gausi 
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: 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...
Ja, damit geht das erschreckend einfach.
@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
|
Verfasst: Mi 12.05.10 22:24
jaenicke hat folgendes geschrieben : | 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 
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Mi 12.05.10 22:27
Richtig, und genau das kann man damit feststellen.
Delphi-Quelltext 1: 2:
| p1 := GetEnvironmentVariable('ProgramW6432'); p2 := GetEnvironmentVariable('ProgramFiles'); | liefert bei einer 32-Bit-Exe auf einem 64-Bit-System beide Programme-Order. 
_________________ We are, we were and will not be.
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 12.05.10 22:31
|
|
Gausi 
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: 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. 
_________________ We are, we were and will not be.
|
|