AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) 32-Bit-Programm soll 32- und 64-Bit-OS erkennen
Thema durchsuchen
Ansicht
Themen-Optionen

32-Bit-Programm soll 32- und 64-Bit-OS erkennen

Ein Thema von Delphi-Laie · begonnen am 9. Sep 2011 · letzter Beitrag vom 11. Apr 2012
Antwort Antwort
Seite 2 von 4     12 34      
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#11

AW: 32-Bit-Programm soll 32- und 64-Bit-OS erkennen

  Alt 9. Sep 2011, 11:53
Das mit der Environment-Variable erschien mir schon optimal, aber dann wurde die Idee hier eingeworfen, sie selbst zu defnieren....

Das sieht sehr gut aus, danke!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: 32-Bit-Programm soll 32- und 64-Bit-OS erkennen

  Alt 9. Sep 2011, 11:54
Zitat:
function IsWow64Process(hProcess:THandle;var Wow64Process:pbool):bool;stdcall;external kernel32 name 'IsWow64Process';
Falsche Deklaration?
VAR + BOOL (delphilike)
oder
PBOOL (WinAPI-vorgabe)


Und das ist natürlich eine statiscjhe Bindung, welche vor WinXP SP2 überall knallen wird.



Mit MSDN-Library durchsuchenLoadLibrary die DLL laden (falls noch nicht ist) und das Handle holen.
Und dann mit MSDN-Library durchsuchenGetProcAddress den Zeiger zur Prozedur/Funktion.

Statt LoadLibrary (hier FreeLibrary am Ende nicht vergessen) kann man auch MSDN-Library durchsuchenGetModuleHandle verwenden, welches das Handle einer geladenen DLL liefert (0 falls nicht geladen), aber bei eigentlich immer geladenen SystemDLLs die ideale Lösung, um sich offiziell um das FreeLibrary zu drücken.




Zitat:
Das mit der Environment-Variable erschien mir schon optimal, aber dann wurde die Idee hier eingeworfen, sie selbst zu defnieren....
Hast du den XE2-Thread gesehn, wo es sich nicht kompilieren ließ, weil eine Umgebungsvariable alles "stört"?
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#13

AW: 32-Bit-Programm soll 32- und 64-Bit-OS erkennen

  Alt 9. Sep 2011, 12:00
Also diese:
Delphi-Quellcode:
function IsWOW64: Boolean;
type
  TIsWow64Process = function( // Type of IsWow64Process API fn
    Handle: THandle;
    var Res: BOOL
  ): BOOL; stdcall;
var
  IsWow64Result: BOOL; // result from IsWow64Process
  IsWow64Process: TIsWow64Process; // IsWow64Process fn reference
begin
  // Try to load required function from kernel32
  IsWow64Process := GetProcAddress(
    GetModuleHandle('kernel32'), 'IsWow64Process'
  );
  if Assigned(IsWow64Process) then
  begin
    // Function is implemented: call it
    if not IsWow64Process(GetCurrentProcess, IsWow64Result) then
      raise Exception.Create('Bad process handle');
    // Return result of function
    Result := IsWow64Result;
  end
  else
    // Function not implemented: can't be running on Wow64
    Result := False;
end;
Genau das haben wir ja schon gesagt: Dynamisch einbinden.

Aber ich würde sie umbenennen: Is32BitProcess bei IsWow64Process bekomme ich immer einen Knoten im Hirn. Ich muss dann immer überlegen was es eigentlich heißt.
Michael
Ein Teil meines Codes würde euch verunsichern.

Geändert von Luckie ( 9. Sep 2011 um 12:04 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#14

AW: 32-Bit-Programm soll 32- und 64-Bit-OS erkennen

  Alt 9. Sep 2011, 12:04
Und die Funktion muss ja im Gegensatz zur ersten Behauptung in beiden DLL-Versionen vorhanden sein:
- 32Bit-Exe: kann keine 64Bit-DLL laden und somit die Funktion gar nicht ermitteln -> sie wäre somit nutzlos
- 64Bit-Exe: sobald sie läuft, ist das ja wohl automatisch ein 64Bit-OS
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
CCRDude

Registriert seit: 9. Jun 2011
678 Beiträge
 
FreePascal / Lazarus
 
#15

AW: 32-Bit-Programm soll 32- und 64-Bit-OS erkennen

  Alt 9. Sep 2011, 12:07
Die 32 bit .exe lädt automatisch die 32 bit kernel32.dll, eine 64 bit .exe lädt automatisch die 64 bit kernel32.dll

Somit sähe das korrekt so aus:

- 32Bit-Exe unter 32Bit-Win: lädt kernel32.dll(32Bit), findet dort kein IsWow64Process - also false.
- 32Bit-Exe unter 64Bit-Win: lädt kernel32.dll(32Bit), findet dort IsWow64Process - also true.
- 64Bit-Exe: lädt kernel32.dll(64bit), findet dort IsWow64Process, welches false zurückgeben dürfte.

Ein Umbenennen in Is32BitProcess wäre etwas anderes (bzw. das kommt halt drauf an, wie man obige Situationen auswertet) - Is32BitProcess wäre für mich aber vermutlich sinnlos, weil ich das bereits zur Compile Time per Direktive regeln könnte.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#16

AW: 32-Bit-Programm soll 32- und 64-Bit-OS erkennen

  Alt 9. Sep 2011, 12:09
Ja eben, von daher stimmt die anfangs getroffene Behauptung, die Funktion gäbe es nur in der 64Bit-Version der DLL, nicht bzw. kann ja gar nicht stimmen.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#17

AW: 32-Bit-Programm soll 32- und 64-Bit-OS erkennen

  Alt 9. Sep 2011, 13:19
Und das ist natürlich eine statiscjhe Bindung, welche vor WinXP SP2 überall knallen wird.
Kleiner Hinweis: Auf meinem XP SP1 (auf dem XE2-Compilate nicht erfolgreich starten) "knallt" es, obwohl die Funktion natürlich fehlt, auch bei statischer Einbindung nicht.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#18

AW: 32-Bit-Programm soll 32- und 64-Bit-OS erkennen

  Alt 9. Sep 2011, 13:29
Das darf auch nicht knallen, weil die Funktion dort existieren sollte. (Bei mir jedenfalls ist die da.)

// EDIT:
Nebenbei steht bei Microsoft explizit, dass man diese Funktion nicht statisch einbinden sollte.

// EDIT2:
Ok, ist bei mir auch SP3, das wurde im virtuellen PC doch schon automatisch aktualisiert. Aber grad nochmal zurückgesetzt, die Funktion ist auch mit SP1 dabei.
Sebastian Jänicke
AppCentral

Geändert von jaenicke ( 9. Sep 2011 um 13:38 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.202 Beiträge
 
Delphi 10.4 Sydney
 
#19

AW: 32-Bit-Programm soll 32- und 64-Bit-OS erkennen

  Alt 9. Sep 2011, 13:32
Statt LoadLibrary (hier FreeLibrary am Ende nicht vergessen) kann man auch MSDN-Library durchsuchenGetModuleHandle verwenden, welches das Handle einer geladenen DLL liefert (0 falls nicht geladen), aber bei eigentlich immer geladenen SystemDLLs die ideale Lösung, um sich offiziell um das FreeLibrary zu drücken.
Und genau in den gleichen Fehler landen wie Borland fallen wenn mal wieder System-DLL's unbenannt werden und der LoadLibrary-Aufruf im OS damit zurecht kommt und die jetzt gültige Library(-Handle) zurückliefert aber der GetModuleHandle fehl schlägt.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#20

AW: 32-Bit-Programm soll 32- und 64-Bit-OS erkennen

  Alt 9. Sep 2011, 15:18
Das darf auch nicht knallen, weil die Funktion dort existieren sollte. (Bei mir jedenfalls ist die da.)
Laut MSDN existiert sie ab Windows XP SP2. Aber der "Minimum supported client" wird im Verlaufe der Zeit dort immer mehr nach oben verschoben. So existiert eine Unmenge Funktionen schließlich schon seit Windows 1.x, 2.x, 3.x oder 4.x, doch davon liest man nichts (mehr). Wie gesagt, auf meinem XP SP1 gibt es damit keine Fehlermeldung bzw. keinen Programmabruch.

Nebenbei steht bei Microsoft explizit, dass man diese Funktion nicht statisch einbinden sollte.
Darf ich fragen, wo? In der entsprechenden Seite auf MSDN finde ich dazu nichts.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 4     12 34      


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 19:29 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