Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Umgebungsvariablen auf Win64 / Programme-Verzeichnis sauber ermitteln (https://www.delphipraxis.net/167235-umgebungsvariablen-auf-win64-programme-verzeichnis-sauber-ermitteln.html)

Dalai 19. Mär 2012 16:02

Umgebungsvariablen auf Win64 / Programme-Verzeichnis sauber ermitteln
 
Hey Leute,

ich habe ein Programm, mit dessen Hilfe verschiedene Anwendungen auf einem System installiert werden können. Die Definitionen dafür befinden sich in je einer INI. Um die ggf. bereits auf dem System befindliche Version einer Anwendung zu ermitteln, gibt man in der INI z.B. dies an:
Code:
[Script]
InstallCheck=%ProgramFiles%\Internet Explorer\iexplore.exe
Wie bekomme ich es hin, dass die Umgebungsvariablen auf einem 64 Bit Windows so aufgelöst werden, wie man das erwartet? Oder anders ausgedrückt: ich möchte auf einem 32 Bit Windows den 32 Bit Pfad herausbekommen und auf einem 64 Bit Windows den 64 Bit Pfad.

Bislang habe ich erfolglos mit den Funktionen Wow64DisableWow64FsRedirection() und Konsorten probiert, aber auch ein
Delphi-Quellcode:
SHGetSpecialFolderPath(Self.Handle, buf, CSIDL_PROGRAM_FILES, False)
gibt immer
Code:
C:\Program Files (x86)
zurück, so dass ich noch nicht einmal die Umgebungsvariablen manuell korrigieren könnte via SetEnvironmentVariable(). Den Pfad selbst aus der Registry auszulesen, ist ja auch nicht unbedingt die feine und bevorzugte Art...

Hat jemand Ideen?

MfG Dalai

PS: Die Sache beschränkt sich nicht unbedingt nur auf %ProgramFiles%, denn ich weiß ja vorher nicht, welche Umgebungsvariable in der INI angegeben wird.

p80286 19. Mär 2012 16:12

AW: Umgebungsvariablen auf Win64
 
Wenn ich der Wikipedia (hier) glauben darf gibt es zwei Variablen dafür, und mit PROGRAMMFILES solltest Du immer im 64Bit Zweig landen ??

Gruß
K-H

Dalai 19. Mär 2012 17:25

AW: Umgebungsvariablen auf Win64
 
Zitat:

Zitat von p80286 (Beitrag 1157389)
Wenn ich der Wikipedia (hier) glauben darf gibt es zwei Variablen dafür

Das ist mir bekannt. Das nützt mir aber nichts. Die Variable %ProgramFiles% soll je nach Architektur aufgelöst werden. Ich gebe mal ein konkretes Beispiel: ClassicShell gibt es in einem einzigen Paket, das sowohl auf 32 als auch 64 Bit installiert werden kann. Um nun dessen Existenz zu prüfen, gebe ich z.B.
Code:
InstallCheck=%ProgramFiles%\Classic Shell\ClassicStartMenuDLL.dll
an. Nun geht das natürlich auf einem 64 Bit Windows schief, wenn die Variable immer nach "Program Files (x86)" aufgelöst wird, weil es eben in "Program Files" installiert ist.

Zitat:

und mit PROGRAMMFILES solltest Du immer im 64Bit Zweig landen ??
Ist aber nicht so. Deswegen frage ich ja hier. Mit %SystemRoot% klappt das übrigens einwandfrei, wenn ich vorher Wow64DisableWow64FsRedirection() aufrufe.

MfG Dalai

Dalai 19. Mär 2012 19:04

AW: Umgebungsvariablen auf Win64
 
Ich wusste ja schon immer, dass es MS drauf hat :roll:. Aber das setzt dem Ganzen die Krone auf:
Zitat:

Zitat von http://msdn.microsoft.com/en-us/library/windows/desktop/dd378457(v=vs.85).aspx
FOLDERID_ProgramFilesX64

This value is not supported on 32-bit operating systems. It also is not supported for 32-bit applications running on 64-bit operating systems. Attempting to use FOLDERID_ProgramFilesX64 in either situation results in an error.

Das heißt also auf gut deutsch: Noch nicht einmal mit der (neuesten, erst seit Vista verfügbaren) Funktion SHGetKnownFolderPath() könnte ich den echten Pfad ermitteln. Humor ham'se dann auch noch - sofern man das so interpretieren will, denn FOLDERID_ProgramFilesCommonX64 gibt einen ordentlichen Wert zurück mit einer 32 Bit Anwendung auf einem 64 Bit OS, wie man in den Remarks zu MSDN-Library durchsuchenKNOWNFOLDERID lesen kann. Aber FOLDERID_ProgramFilesX64 braucht man ja auch nicht, denn es gibt ja keine Anwendungsfälle für sowas :roll: :evil: ...

Tja, wenn niemand noch eine (bessere) Idee hat, bleibt mir wohl nichts anderes übrig, als auf die Registry zurückzugreifen, wenn %ProgramFiles% im Wert steht, obwohl man solche Pfade eigentlich nicht via Registry sondern API-Funktion ermitteln soll.

MfG Dalai


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:30 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz