Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Wie kann ich eine 64bit-Anwendung erkennen? (https://www.delphipraxis.net/101924-wie-kann-ich-eine-64bit-anwendung-erkennen.html)

ringli 20. Okt 2007 16:16


Wie kann ich eine 64bit-Anwendung erkennen?
 
Gibt es eigentlich eine Möglichkeit eine 64bit-Anwendung zu erkennen? Ich stelle mir da so was in der Richtung wie
Delphi-Quellcode:
if Is64bitApp('test.exe') then showmessage('64bit-Anwendung');
vor.

Hintergrund der Frage ist der das ich von einer fremden Anwendung die Registrierungsdaten sichern/wiederherstellen möchte. Diese Anwendung gibt es sowohl als 32bit- als auch als 64bit-Version. Wenn jetzt die 32bit-Version unter einem 64bit-Windows ausgeführt wird, muss ich den Registry-Pfad "HKLM\Software\WOW6432Node\..." sichern. Und wenn die 64bit-Version der Anwendung ausgeführt wird, muss ich entsprechend den Registry-Pfad "HKLM\Software\..." sichern. Den Beitrag Registry: WOW6432NODE in der Codelib habe ich gefunden, aber der hilft mir ja nicht beim Erkennen einer 64bit-Anwendung.

Reinhard Kern 20. Okt 2007 17:22

Re: Wie kann ich eine 64bit-Anwendung erkennen?
 
Zitat:

Zitat von ringli
Gibt es eigentlich eine Möglichkeit eine 64bit-Anwendung zu erkennen? Ich stelle mir da so was in der Richtung wie
Delphi-Quellcode:
if Is64bitApp('test.exe') then showmessage('64bit-Anwendung');
vor.

...

Hallo,

es gibt im PE/COFF-Format für jeden Code-Abschnitt ein "Machine Field", dort steht 0x14c für 386 und 0x8664 für x64. Am besten besorgst du dir die PE/COFF-Doc (pecoffv8.doc) von MS.

Die Sache ist nicht ganz so einfach, weil:
es können viele Programm-"Dateien" in einer PE-Datei enthalten sein, die müssen nicht alle für die gleiche CPU sein.
Ausserdem können auch Programme aus maschinenunabhängigem Code bestehen (DLL,.NET).

Gruss Reinhard

ringli 20. Okt 2007 18:33

Re: Wie kann ich eine 64bit-Anwendung erkennen?
 
Danke für deine Antwort. :)

Ich habe mir jetzt auf Basis von ErazerZ's Portable Executable File Unit die folgende Funktion erstellt:
Delphi-Quellcode:
function Is64bitPE(FileName : String) : Boolean;
const
  x64 = $8664;
var
  PE : TPeFile;
begin
  Result := False;
  PE := TPeFile.Create;
  try
    if PE.LoadFromFile(FileName) then
      begin
        if PE.ImageNtHeaders.FileHeader.Machine = x64 then
          begin
            Result := True;
          end;
      end;
  finally
    PE.Free;
  end;
end;
Für meinen Anwendungsfall funktioniert es so jedenfalls. :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:12 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-2025 by Thomas Breitkreuz