AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) läuft Programm unter 32-Bit oder 64-Bit ab ?
Thema durchsuchen
Ansicht
Themen-Optionen

läuft Programm unter 32-Bit oder 64-Bit ab ?

Ein Thema von Gerkey · begonnen am 6. Jun 2017 · letzter Beitrag vom 10. Jun 2017
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#11

AW: läuft Programm unter 32-Bit oder 64-Bit ab ?

  Alt 6. Jun 2017, 16:45
Die Originalfrage wird aber genau durch diesen Rückgabewert beantwortet, denn das Programm ist per Vorgabe 32-Bit.
Da habe ich die Frage scheinbar falsch verstanden. Ich ging davon aus, dass er sowohl für 32 als auch für 64 Bit kompilieren will.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Gerkey

Registriert seit: 18. Okt 2016
Ort: Bad Kreuznach
55 Beiträge
 
Delphi XE Professional
 
#12

AW: läuft Programm unter 32-Bit oder 64-Bit ab ?

  Alt 9. Jun 2017, 16:19
Mit der Bitte um Nachsicht für einen Noch-Anfänger : Wie setze ich denn "isWOW64Process" im Programm ein ?
Gibt's es irgendwo einen Beispiel-Code ?

Gerkey
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#13

AW: läuft Programm unter 32-Bit oder 64-Bit ab ?

  Alt 9. Jun 2017, 16:23
Gibt's es irgendwo einen Beispiel-Code ?
Delphi-Quellcode:
  
  function IsWOW64: BOOL;
  begin
    IsWow64Process(GetCurrentProcess, Result);
  end;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Gerkey

Registriert seit: 18. Okt 2016
Ort: Bad Kreuznach
55 Beiträge
 
Delphi XE Professional
 
#14

AW: läuft Programm unter 32-Bit oder 64-Bit ab ?

  Alt 10. Jun 2017, 09:47
Meine Delphi - Kenntnisse und Fähigkeiten sind wohl schon wieder an ihre Grenzen gestoßen ! Wenn ich die Funktion "IsWOW64" in der angegebenen Form ins Programm übernehme, erhalte ich folgende Meldung: "Es gibt keine überladene Version von ‘IsWOW64Process‘, die man mit diesen Argumenten aufrufen kann !".
Gibt es denn irgendwo eine Dokumentation, die mir weiterhelfen kann, ohne dass ich Euch Experten mit offensichtlich banalen Fragen bemühen muss ?

Gerkey
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#15

AW: läuft Programm unter 32-Bit oder 64-Bit ab ?

  Alt 10. Jun 2017, 13:24
Ich habe jetzt gerade kein XE zur Hand, daher passt mein Code für Tokyo. Schau doch mal in der Windows.pas nach der Deklaration von IsWow64Process. Hier sieht das so aus:

Delphi-Quellcode:
function IsWow64Process(hProcess: THandle; Wow64Process: PBOOL): BOOL; overload; stdcall;
function IsWow64Process(hProcess: THandle; var Wow64Process: BOOL): BOOL; overload; stdcall;
Zeig doch mal die Deklaration bei dir.

Falls das zweite Overload noch nicht da ist, geht es eventuell auch so:

Delphi-Quellcode:
function IsWOW64: BOOL;
begin
  IsWow64Process(GetCurrentProcess, @Result);
end;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
972 Beiträge
 
Delphi 6 Professional
 
#16

AW: läuft Programm unter 32-Bit oder 64-Bit ab ?

  Alt 10. Jun 2017, 16:08
Hmm..

Da IsWow64Process erst ab einem späteren Delphi verfügbar ist, nutze ich folgende Funktion, um festzustellen, ob meine App in einer 64Bit-Umgebung läuft.. (Benutze halt noch D6 Prof und werde NICHT zur Starter wechseln !) )

(Keine Ahnung mehr, wo ich den herhabe.. )

Delphi-Quellcode:
function IsWow64A: Boolean;
type
  TIsWow64Process = function( // Type of IsWow64Process API fn
    Handle: Windows.THandle; var Res: Windows.BOOL ): Windows.BOOL; stdcall;
var
  IsWow64Result: Windows.BOOL; // Result from IsWow64Process
  IsWow64Process: TIsWow64Process; // IsWow64Process fn reference
begin
  // Try to load required function from kernel32
  IsWow64Process := Windows.GetProcAddress(Windows.GetModuleHandle('kernel32'), 'IsWow64Process');

  if Assigned(IsWow64Process) then begin
    // Function is implemented: call it
    if not IsWow64Process(Windows.GetCurrentProcess, IsWow64Result) then
      raise Exception.Create('IsWow64: bad process handle');

    Result := IsWow64Result; // Return result of function
  end else
    // Function not implemented: can't be running on Wow64
    Result := False;
end;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#17

AW: läuft Programm unter 32-Bit oder 64-Bit ab ?

  Alt 10. Jun 2017, 17:38
Dieser Code ist aber ein schlechtes Beispiel.

Da verschwendet man Minuten, nur um dann mitzubekommen, dass maximal der letzte Kommentar halbwegs wichtige Informationen enthält.
Alles davor ist absolut sinnlos und stellt nur doppelte Informationen für den eigentlich "selbsterklärenden Code dar.
Wichtige Informationen gehen durch Sinnlose Kommentare schnell mal verloren, bzw. man sieht sie garnicht erst, weil man keine Lust mehr hat sich ständig sinnloses Zeug durchzulesen.

Im Gegenzug fehlt dafür die Beschreibung der Fuktion selbst und IsWow64A ist auch falsch, da es hier "dynimisch" implementiert wurde und nicht als ANSI.

Delphi-Quellcode:
/// <summary> Determines whether the specified process is running under WOW64.<br /> WOW64 is the x86
/// emulator that allows 32-bit Windows-based applications to run seamlessly on 64-bit Windows </summary>
function IsWow64: Boolean;
type
  TIsWow64Process = function(Handle: THandle; var Res: BOOL): BOOL; stdcall;
var
  IsWow64Process: TIsWow64Process;
  IsWow64Result: BOOL;
begin
  IsWow64Process := GetProcAddress(GetModuleHandle('kernel32'), 'IsWow64Process');
  if Assigned(IsWow64Process) then begin
    if not IsWow64Process(GetCurrentProcess, IsWow64Result) then
      RaiseLastOSError; //RaiseLastWin32Error; //raise Exception.Create(SysErrorMessage(GetLastError));
    Result := IsWow64Result;
  end else
    Result := False; // Function not implemented: can't be running on Wow64
end;
Oder als kurzer Inlinetype.
Delphi-Quellcode:
var
  IsWow64Process: function(Handle: THandle; var Res: BOOL): BOOL; stdcall;
  IsWow64Result: BOOL;
So würde explizit ANSI (A) oder Unicode (W) verwendet.
Das Andere passt sich jeweils an die vom Delphi "standardmäßig" verwendete API-Version an. (Unicode seit D2009)
Delphi-Quellcode:
IsWow64Process := GetProcAddressA(GetModuleHandleA('kernel32'), 'IsWow64Process');

IsWow64Process := GetProcAddressW(GetModuleHandleW('kernel32'), 'IsWow64Process');
/// <summary> ist die etwas menschenlesbare Version des DocInsight, was die Erweiterung zum HelpInsight darstellt.
Normal z.B. so:
Delphi-Quellcode:
// Determines whether the specified process is running under WOW64.
// WOW64 is the x86 emulator that allows 32-bit Windows-based applications to run seamlessly on 64-bit Windows
HelpInsight : Das zeigt als Hint im Delphi die Funktionsdeklaration an.
DocInsight : Das zeigt stattdessen explizite HilfeInfos an (DelphiDoc ala Bei Google suchenPHPDoc)
Bei Google suchenDocumentation Insight : erweiteres HelpInsight samt integriertem Editor und Hilfegenerator (Dokumentierter Code -> Programm-Hilfe ala .hlp, .chm usw.) ... leider hatte Delphi das nur 2 Jahre lang direkt integriert und hat nur wieder nur die "manuellen" Code-Vorlagen dabei
$2B or not $2B
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
972 Beiträge
 
Delphi 6 Professional
 
#18

AW: läuft Programm unter 32-Bit oder 64-Bit ab ?

  Alt 10. Jun 2017, 20:28
Hmm..

@himitsu

Wieso ist der Code blödsinn?
In D6 gibt es keine Definition von IsWow64Process.

Unter älteren OS (vor XP SP2) gibt es auch diese Funktion nicht in kernel32. (Auch wenn das heute kaum noch jemanden iterressiert, jedoch haben wir tatsächlich noch Kunden mit W2K-Rechnern..)
Diese Funktion gibt es auch auf 32Bit-Systemen, somit sollte das 'Nichtvorhandensein' heute die Ausnahme sein.

Dass er nicht optimiert ist, kann sein.. Ist halt nur Copy/Paste und funktioniert.
Dass hier GetProcAddress statt GetProcAddressA obwohl am Funktionskopf mit 'A' angezeigt verwendet wird..
Ist mir selber noch nicht aufgefallen und macht für die Verwendung eigentlich auch keinen Unterschied.


Das was Dir diese Funktion zurück gibt, ist, dass deine Filezugriffe deiner App umgeleitet werden oder nicht.
Gerade bei Berücksichtigung der von Dir angegebenen Funktion 'Wow64DisableWow64FsRedirection' ist dieser Source brauchbar, da Du damit prüfen kannst, ob dein Disable der Umleitung funtioniert/noch aktiv ist.

Ich nutze sie z.B. um meine Reg-Zugriffe mit einem Flag zu versehen und so ohne 'Wow64DisableWow64FsRedirection' dennoch auf die 64Bit -Pfade zuzugreifen.

Den 'Wow64DisableWow64FsRedirection' hat einen Haken :

Zitat:
For example, DLL loading depends on file system redirection, so disabling file system redirection will cause DLL loading to fail.
Sprich, da kein Redirecting, wird versucht die 64Bit-DLL statt die 32Bit-DLL aus dem umgeleiteten Verzeichnis zu laden und dass dürfte wohl nicht so ganz funktionieren.

Auch für den Zugriff auf System32 (ohne Umleitung) gibt es eine saubere Alternative : %Windir%\Sysnativ\ (oder so, aus dem Kopf geschrieben).

Ich habe z.B. bei der Registry nicht verstranden, wieso es darin Umeitungen gibt.
Bei allen anderen kann ich einen gewissen Sinn (laden der 32Bit DLLs) verstehen.

Jedoch diese für meine 32 Bit App komplett abschalten und dann Gefahr laufen, dass es dann an anderer Stelle nicht klapt ist mir zu heikel.
Da ich 32Bit Apps erstelle nutze ich an den Stellen den meiner Meinung nach sauberen, geziehlten Weg um die Umlenkung zu 'umgehen'
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#19

AW: läuft Programm unter 32-Bit oder 64-Bit ab ?

  Alt 10. Jun 2017, 20:42
Der Code ist OK, aber die Kommentierung ist blödsinn.

Kennst du das Problem mit dem Heu und diesem kleinen spitzen Ding?
Die nutzlosen Kommentare sind das Heu und die Nadel (das Wichtige) findet nur der Terence Hill (nur Chuck Norris wird von der Nadel gefunden).
$2B or not $2B

Geändert von himitsu (10. Jun 2017 um 20:47 Uhr)
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
972 Beiträge
 
Delphi 6 Professional
 
#20

AW: läuft Programm unter 32-Bit oder 64-Bit ab ?

  Alt 10. Jun 2017, 20:59
@himitsu

Dann muss ich mich bei Dir entschultigen..

Nach dem nun 2/3. Mal (Mit einem kühlen Getränk dazwischen) ist es mir nun auch klar geworden, dass es Dir um die Kommentare/Fehlbenennung gíng und nicht um den Sinn der Funktion.

HelpInsight/DocInsight haben für mich bisher keine Bewandtnis gehabt, Kommentare wurden frei Schnautze erstellt.

Die von mir gepostete Funktion hatte ich irgendwo per Copy/Paste kopiert und habe deren Funktionen auch ohne die vorhandenen Kommentare verstanden, diese jedoch nicht gelöscht/korrigiert... (Waren halt nur Kommentare )

Ich denke, dass ich die Funktion auch eher von

function IsWow64: Boolean;

nach

function IsWow64Redirect: Boolean;

umbenennen würde, da somit auch am Namen direkt klarer erkennbar ist, was sie zurückliefert
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:25 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