Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Windows Programme Ordner x64 in 32 bit Progrmm ermitteln (https://www.delphipraxis.net/203061-windows-programme-ordner-x64-32-bit-progrmm-ermitteln.html)

Guido Eisenbeis 9. Jan 2020 05:16

Windows Programme Ordner x64 in 32 bit Progrmm ermitteln
 
Hallo.

Zitat:

Zitat von RWarnecke, 7. Sep 2012 (Beitrag 1182055)
Auf einem Windows 64Bit wird CSIDL_PROGRAM_FILES bei einem 32Bit-Programm C:\Program Files (x86) und ein 64Bit-Programm C:\Program Files als Ergebnis liefern.

Gibt es mittlerweile (9. Jan 2020) eine Möglichkeit, aus einem 32 bit Programm den Programme Ordner für 64 bit Programme zu ermitteln?


Disclaimer: Bitte nur Lösungen posten, die funktionieren. Bitte nicht raten, und keine Suche empfehlen, weder Google & Co, noch Forensuche usw. Bitte keine Verweise auf Threads, wo ähnliches gefragt wurde, es sei den es wurde eine Lösung gefuden. Auch nicht mehr fragen, ob ich schon ... Ich habe! Und nichts gefunden.

Guido Eisenbeis 9. Jan 2020 06:11

AW: Windows Programme Ordner x64 in 32 bit Progrmm ermitteln
 
Das stimmt nicht. Ich habe doch gebeten, nicht zu raten. Bitte teste doch mal selbst.


Resolve PROGRAMFILES variable from 32bit app in Win64 OS

Guido Eisenbeis 9. Jan 2020 07:21

AW: Windows Programme Ordner x64 in 32 bit Progrmm ermitteln
 
Hallo Frühlingsrolle.
Delphi-Quellcode:
  // uses SysUtils;
  Edit1.Text := GetEnvironmentVariable('ProgramW6432');
  Edit2.Text := GetEnvironmentVariable('ProgramFiles(x86)');
Die Lösung mit den Umgebungsvariablen kenne ich, die ist im Link drin, den ich oben gepostet habe. Das wäre zwar eine Möglichkeit, (sogar die einzige, die ich kenne), aber Umgebungsvariablen sind nicht zuverlässig. Gibt es eine andere Lösung?

Dennoch vielen Dank für deine Mühe! :thumb:

Guido Eisenbeis 9. Jan 2020 08:17

AW: Windows Programme Ordner x64 in 32 bit Progrmm ermitteln
 
Da hast du Recht. *seufz* :? Ich habe da ewig lange recherchiert und nichts gefunden. Danke für den Versuch, so bin ich wenigstens nicht allein. :wink:

DeddyH 9. Jan 2020 08:26

AW: Windows Programme Ordner x64 in 32 bit Progrmm ermitteln
 
In diesem Thread kam ein guter Vorschlag:
Zitat:

You can write an 64 bit app to get the information for you. There is no API to get the 64 bit program files from a 32 bit caller.

Guido Eisenbeis 9. Jan 2020 08:46

AW: Windows Programme Ordner x64 in 32 bit Progrmm ermitteln
 
Hallo Detlef.

Leider ist das keine Lösung, wie gesagt, es soll aus einer 32 bit Anwendung ermittelt werden.

Der Hintergrund ist der, dass ich mit meinem Programm (sagen wir MyProg) herausfinden will, wo sich ein fremdes Programm (nennen wir's ExternalProg) installiert hat. Da ich nicht weiß, ob der User ExternalProg_x86 oder ExternalProg_x64 installiert hat, muss ich beide Pfade ermitteln. MyProg ist eine 32 bit Anwendung, weil die auch auch 64 bit OS läuft, aber umgekehrt funktioniert das nicht. :wink:

Danke für den Tipp!

DeddyH 9. Jan 2020 08:53

AW: Windows Programme Ordner x64 in 32 bit Progrmm ermitteln
 
Wenn sich das externe 64bit-Programm nicht starten lässt, weil es sich um ein 32Bit-Windows handelt, kannst Du Dir den Rest der Prüfung doch sparen.

Guido Eisenbeis 9. Jan 2020 08:59

AW: Windows Programme Ordner x64 in 32 bit Progrmm ermitteln
 
Zitat:

Zitat von DeddyH (Beitrag 1454709)
Wenn sich das externe 64bit-Programm nicht starten lässt, weil es sich um ein 32Bit-Windows handelt, kannst Du Dir den Rest der Prüfung doch sparen.

Nicht schlecht, Herr Specht! :wink:

Aber wie soll ich es starten, wenn ich nicht weiß wo es installiert ist? :mrgreen:

Gibt es denn einen virutellen Ordner Pfad oder was ähnliches, der auf allen Windowsen gleich ist? Wie heißt denn "Program files" z. B. in einem französichen Windows, oder einem kroatischen? Chinesisch ist auch nicht schlecht.

TiGü 9. Jan 2020 09:22

AW: Windows Programme Ordner x64 in 32 bit Progrmm ermitteln
 
Zitat:

Zitat von Guido Eisenbeis (Beitrag 1454712)
Gibt es denn einen virutellen Ordner Pfad oder was ähnliches, der auf allen Windowsen gleich ist? Wie heißt denn "Program files" z. B. in einem französichen Windows, oder einem kroatischen? Chinesisch ist auch nicht schlecht.

Ich nehme an, du hast ein deutsches Windows installiert?
Tippe doch in eine beliebige Windows Explorer Addresszeile das englische "C:\Program files" (ja, ohne Anführungszeichen) und schaue wo du rauskommst!


Des Weitern würde ich mal in die Windows Registry nachschauen, ob dieses ominöse "ExternalProg" ggf. den Informationen zu seinen Aufenthaltsort abspeichert.

Uwe Raabe 9. Jan 2020 09:23

AW: Windows Programme Ordner x64 in 32 bit Progrmm ermitteln
 
Die Ordner heißen immer Program Files bzw. Program Files (x86). Die Übersetzungen sind nur Links. So verweist "C:\Programme" hier unter einem 64-Bit Programm auf "C:\Program Files".

generic 9. Jan 2020 09:37

AW: Windows Programme Ordner x64 in 32 bit Progrmm ermitteln
 
Wenn du wissen willst, ob ein Programm installiert ist, dann schau doch in
Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Win dows\CurrentVersion\Uninstall
und
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\ Windows\CurrentVersion\Uninstall
nach.

Im Wert "InstallLocation" ist der Ordner drin.

Wenn es sich um ein MSI handelt, dann kannst du den Windows-Installer über die API direkt abfragen.
Wenn du eine bestimmte Funktion davon braucht, könnte man auch auf eine Komponente prüfen.

Guido Eisenbeis 9. Jan 2020 09:54

AW: Windows Programme Ordner x64 in 32 bit Progrmm ermitteln
 
Zitat:

Zitat von TiGü (Beitrag 1454714)
Tippe doch in eine beliebige Windows Explorer Addresszeile das englische "C:\Program files" (ja, ohne Anführungszeichen) und schaue wo du rauskommst!

Das ist klar, aber ohne Bestätigung und / oder Gegenprüfung kann ich zwar vermuten (was ich ja auch habe) :wink: aber nicht gleich darauf schließen, dass das z. B. im kyrillischen oder chinesischen genauso ist. :spin2:

Zitat:

Zitat von TiGü (Beitrag 1454714)
Des Weitern würde ich mal in die Windows Registry nachschauen, ob dieses ominöse "ExternalProg" ggf. den Informationen zu seinen Aufenthaltsort abspeichert.

Leider nicht zuverlässig, da man zu allem Überfluss das ExternalProg auch portable installieren kann. Aber gute Idee! :thumb:

Zitat:

Zitat von Uwe Raabe (Beitrag 1454715)
Die Ordner heißen immer Program Files bzw. Program Files (x86). Die Übersetzungen sind nur Links. So verweist "C:\Programme" hier unter einem 64-Bit Programm auf "C:\Program Files".

Das wäre die ideale Lösung, da ich in meinem Code die Ordner "halb-hart"-codiert abklappere:
Delphi-Quellcode:
FileExists('C:\Program Files\ExampleFolder\ExternalProg.exe') ...
FileExists('C:\Program Files (x86)\ExampleFolder\ExternalProg.exe') ...
Ist das auch in chinesisch, kroatisch, usw. so? Bitte nicht falsch verstehen, ich will nur sicher gehen. Nach all dem Suchen wäre somit die Lösung so einfach, oder? :-D

Liegen die Ordner immer im LW-Root? Also könnte ich das abklappern: C:\Program Files, D:\Program Files, E:\Program Files usw?

Guido Eisenbeis 9. Jan 2020 10:10

AW: Windows Programme Ordner x64 in 32 bit Progrmm ermitteln
 
Zitat:

Zitat von generic (Beitrag 1454716)
Wenn du wissen willst, ob ein Programm installiert ist, dann schau doch in
Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Win dows\CurrentVersion\Uninstall
und
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\ Windows\CurrentVersion\Uninstall
nach.

Im Wert "InstallLocation" ist der Ordner drin.

Kann das Auslesen des RegKeys nicht umgeleitet werden, wenn ich mit MyProg_32_bit nachsehen will auf dem 64 bit Registry-Zweig? Schon probiert?
Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Win dows\CurrentVersion\Uninstall

Ansonsten eine gute Idee! :thumb: Werde ich mir ansehen. Mit der Möglichkeit "Program Files" und "Program Files (x86)" zu benutzen, müsste man immer noch die LWs abklappern. Wenn dein Vorschlag mit der Registry funktionieren würde, hätte man gleich den Pfad inkl Unterordner. Bleibt nur zu hoffen, dass die portable Version von ExternalProg nur selten verwendet wird.

DeddyH 9. Jan 2020 10:12

AW: Windows Programme Ordner x64 in 32 bit Progrmm ermitteln
 
Zitat:

Zitat von Guido Eisenbeis (Beitrag 1454712)
Zitat:

Zitat von DeddyH (Beitrag 1454709)
Wenn sich das externe 64bit-Programm nicht starten lässt, weil es sich um ein 32Bit-Windows handelt, kannst Du Dir den Rest der Prüfung doch sparen.

Nicht schlecht, Herr Specht! :wink:

Aber wie soll ich es starten, wenn ich nicht weiß wo es installiert ist? :mrgreen:

Ich meinte Dein eigenes 64Bit-Programm, welches Dir den Pfad ermitteln soll. Das muss dann eben in einem festgelegten Ordner liegen.

Guido Eisenbeis 9. Jan 2020 10:21

AW: Windows Programme Ordner x64 in 32 bit Progrmm ermitteln
 
Zitat:

Zitat von DeddyH (Beitrag 1454704)
In diesem Thread kam ein guter Vorschlag: ...

Das hat sich übrigens als ein Glücksfall erwiesen! :thumb: Zwar war das Hauptthema nicht die Lösung, aber ich habe mir den langen Artikel bis zu Ende angesehen und gaaaaanz am Ende stand eine einzige Zeile, und die auch noch in VB. Die habe ich in Delphi übersetzt und ausprobiert. Bei meinen ersten Tests hat das tatsächlich funktioniert und ich konnte "Program Files" und "Program Files (x86)" mit meine 32 bit Programm auslesen!

Das sieht doch schonmal gut aus. Ist aber noch zu Testen, ob das mit anderen Windowsen auch funktioniert, Win XP, Vista, 7, 8, 8 1/2, :mrgreen: x64, x86, (gibts noch was? Gibts XP und Vista noch? :gruebel: ).

Klaus01 9. Jan 2020 10:23

AW: Windows Programme Ordner x64 in 32 bit Progrmm ermitteln
 
.. ein portables Programm kann irgendwo installiert werden,
Es muss nicht zwangsläufig in Program Files oder Program Files(x86) liegen.

Wenn Du die finden willst, musst Du die ganze Platte durchsuchen.

Grüße
Klaus

Guido Eisenbeis 9. Jan 2020 10:24

AW: Windows Programme Ordner x64 in 32 bit Progrmm ermitteln
 
Zitat:

Zitat von DeddyH (Beitrag 1454724)
Ich meinte Dein eigenes 64Bit-Programm, welches Dir den Pfad ermitteln soll. Das muss dann eben in einem festgelegten Ordner liegen.

Das verstehe ich nicht ganz. :gruebel: Es geht doch um mein 32 bit Programm, das ermitteln soll, wo sich das externe Programm installiert hat.

Guido Eisenbeis 9. Jan 2020 10:27

AW: Windows Programme Ordner x64 in 32 bit Progrmm ermitteln
 
Zitat:

Zitat von Klaus01 (Beitrag 1454727)
.. ein portables Programm kann irgendwo installiert werden,
Es muss nicht zwangsläufig in Program Files oder Program Files(x86) liegen.

Wenn Du die finden willst, musst Du die ganze Platte durchsuchen.

Da hast du Recht. In dem Fall hätte ich schlechte Karten. :cry:

Aviator 9. Jan 2020 10:27

AW: Windows Programme Ordner x64 in 32 bit Progrmm ermitteln
 
Zitat:

Zitat von Guido Eisenbeis (Beitrag 1454728)
Zitat:

Zitat von DeddyH (Beitrag 1454724)
Ich meinte Dein eigenes 64Bit-Programm, welches Dir den Pfad ermitteln soll. Das muss dann eben in einem festgelegten Ordner liegen.

Das verstehe ich nicht ganz. :gruebel: Es geht doch um mein 32 bit Programm, das ermitteln soll, wo sich das externe Programm installiert hat.

Es war so gedacht, dass du dir eine 64-bit Anwendung schreibst die nach dem Programm sucht. Diese 64-bit Software kann ganz ohne Umleitungen zu beachten auf alle Pfade und Registry Zweige zugreifen und deiner 32-bit Anwendung das Ergebnis der Suche zurückmelden.

TiGü 9. Jan 2020 10:28

AW: Windows Programme Ordner x64 in 32 bit Progrmm ermitteln
 
Zitat:

Zitat von Guido Eisenbeis (Beitrag 1454728)
Zitat:

Zitat von DeddyH (Beitrag 1454724)
Ich meinte Dein eigenes 64Bit-Programm, welches Dir den Pfad ermitteln soll. Das muss dann eben in einem festgelegten Ordner liegen.

Das verstehe ich nicht ganz. :gruebel: Es geht doch um mein 32 bit Programm, das ermitteln soll, wo sich das externe Programm installiert hat.

Er meint ein zweites und neues Programm von dir in 64-Bit, was deinem alten 32-Bit Programm Bescheid gibt.
Ein Dienst bietet sich an, der mit dir per TCP kommuniziert.

Guido Eisenbeis 9. Jan 2020 10:34

AW: Windows Programme Ordner x64 in 32 bit Progrmm ermitteln
 
Das wäre ein bisschen zuviel Aufwand. Aber danke euch beiden, jetzt verstehe ich was gemeint ist! :)

Dalai 9. Jan 2020 15:17

AW: Windows Programme Ordner x64 in 32 bit Progrmm ermitteln
 
Zitat:

Zitat von Guido Eisenbeis (Beitrag 1454729)
Zitat:

Zitat von Klaus01 (Beitrag 1454727)
[...]Wenn Du die finden willst, musst Du die ganze Platte durchsuchen.

Da hast du Recht. In dem Fall hätte ich schlechte Karten. :cry:

Aber auch das ist lösbar, indem du dem Nutzer die Möglichkeit gibst, den Ort der Installation anzugeben, ggf. erst, nachdem die automatische Suche fehlschlug.

PS: Ich hasse es, wenn Programme bestimmte Dinge annehmen (ggf. sogar hartkodiert) und der Nutzer keine Möglichkeit hat, vom Standard abweichende Parameter zu bestimmen.

Grüße
Dalai

Luckie 9. Jan 2020 15:28

AW: Windows Programme Ordner x64 in 32 bit Progrmm ermitteln
 
Zitat:

Zitat von Guido Eisenbeis (Beitrag 1454726)
Zitat:

Zitat von DeddyH (Beitrag 1454704)
In diesem Thread kam ein guter Vorschlag: ...

Das hat sich übrigens als ein Glücksfall erwiesen! :thumb: Zwar war das Hauptthema nicht die Lösung, aber ich habe mir den langen Artikel bis zu Ende angesehen und gaaaaanz am Ende stand eine einzige Zeile, und die auch noch in VB. Die habe ich in Delphi übersetzt und ausprobiert. Bei meinen ersten Tests hat das tatsächlich funktioniert und ich konnte "Program Files" und "Program Files (x86)" mit meine 32 bit Programm auslesen!

Das sieht doch schonmal gut aus. Ist aber noch zu Testen, ob das mit anderen Windowsen auch funktioniert, Win XP, Vista, 7, 8, 8 1/2, :mrgreen: x64, x86, (gibts noch was? Gibts XP und Vista noch? :gruebel: ).

Und die Lösung wäre jetzt?

Aber es gibt viele Programme, die den Benutzer fragen, wo irgendwelche anderen Programme installiert sind. Audacity hat zum Beispiel früher gefragt, wo der MP3 Encoder installiert ist.

Für Registryzugriffe kann man ein Flag setzten, so dass 32-Bit Zugriffe nicht umgebogen werden. Gibt es das eventuell auch für die Folder-APIs?

Guido Eisenbeis 9. Jan 2020 15:58

AW: Windows Programme Ordner x64 in 32 bit Progrmm ermitteln
 
Zitat:

Zitat von Dalai (Beitrag 1454766)
Aber auch das ist lösbar, indem du dem Nutzer die Möglichkeit gibst, den Ort der Installation anzugeben, ggf. erst, nachdem die automatische Suche fehlschlug.

Das ist ja cool, genau so ist es in meinem Code! :thumb:

Zuerst lese ich den Eintrag in der Registry, dann sehe ich in "Program files\Unterordner\..." nach, dann in "Program files (86)\Unterordner\...", und wenn nichts gefunden wird, fragt mein Programm den User.


Zitat:

Zitat von Luckie (Beitrag 1454767)
Und die Lösung wäre jetzt?

Es ist ganz unten der letzte Beitrag:
Zitat:

I know this is an old question, but I don't think that hard-coding the path is a good solution. I'm not sure you can rely on this in foreign language versions of Windows for example.

It occured to me that you should be able to get this from the registry. I did a bit more searching and came up with this (this is VB code, but presumably the same or similar in C#):
Code:
RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64).OpenSubKey("SOFTWARE\Microsoft\Windows\CurrentVersion").GetValue("ProgramFilesDir")
Und aus diesem Thread (den hatte ich vergessen) :oops: das hier rausgepickt, um mit einem 32 bit Programm auf den 64 bit Zweig der Registry zugreifen zu können, ohne umgeleitet zu werden:

Edit: Wichtige Änderung: Für KEY_ALL_ACCESS werden Adminrechte benötigt. Zum Lesen genügt KEY_READ. Danke Dalai, für den Hinweis! :-D
Code:
Reg.Access := KEY_WOW64_64KEY or KEY_READ
Guido.

Dalai 9. Jan 2020 16:10

AW: Windows Programme Ordner x64 in 32 bit Progrmm ermitteln
 
Beachte, dass KEY_ALL_ACCESS in Verbindung mit HKLM Adminrechte benötigt. Sofern du nur lesen musst, solltest du stattdessen KEY_READ benutzen.

Grüße
Dalai

Guido Eisenbeis 10. Jan 2020 15:27

AW: Windows Programme Ordner x64 in 32 bit Progrmm ermitteln
 
@Dalai

Ich habe es ausprobiert und kann es bestätigen: Mit KEY_ALL_ACCESS braucht man Adminrechte, mit KEY_READ gehts auch ohne. In meinem Posting #27 habe ich es geändert.

Vielen Dank für den Hinweis! :thumb:

Guido.

Guido Eisenbeis 10. Jan 2020 15:51

AW: Windows Programme Ordner x64 in 32 bit Progrmm ermitteln
 
Da ich schon vor dem Posten einiges recherchiert hatte, dachte ich nicht, dass es eine Lösung für das Problem gibt. Nun haben wir sogar mehrere Lösungen gefunden. Hier meine Favoriten:

- Der Tipp von Uwe Raabe, dass "Program Files" und "Program Files (x86)" auf allen Windows in allen Sprachen vorhanden sind, und die Übersetzungen nur Links sind.

- Der Tipp aus dem EN Forum "stackoverflow", der das Auslesen der Pfade zu "Program Files" und "Program Files (x86)" aus der Registry ermöglicht. Damit kann mit einer 32 bit Exe auf den 64 bit Zweig der Registry zugegriffen werden. Details finden sich in meinem Posting #27.

Ein großes Dankeschön an alle, die geholfen haben! :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:50 Uhr.

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