Warum diverse Compilerschalter CPU32/WIN32 und CPU64/WIN64?
-
- Beiträge: 26
- Registriert: So 24. Jan 2010, 21:56
Warum diverse Compilerschalter CPU32/WIN32 und CPU64/WIN64?
Hallo Lazarus-/Pascalfreunde!
Weiß jemand, warum es für CPU-Bitbreite und Windows-Bitversion verschiedene Compilerschalter gibt (s. Betreff)?
Mich beschäftigt, ob man damit überhaupt zu unterschiedlichen Ergebnissen kommen kann.
Es ist klar, daß Win64 nur auf auf CPU64 ausgeführt werden kann, so daß, wenn man auf Win64 prüft, stattdessen auch CPU64 nehmen könnte.
Doch gilt das auch umgekehrt, kann man also statt CPU64 auch WIN64 verwenden, oder wird eine 64-Bit-CPU auch mit 32-Bit-Software (32-Bit-FPC oder damit erstellte Compilate) erkannt?
Dazu experimentierte ich folgendes:
1. 32-Bit-FPC auf Windows 32 Bit mit 64-Bit-System (also mit 64-Bit-Prozessor), dort werden nur CPU32 und WIN32 erkannt
2. 32-Bit-FPC auf Windows 64 Bit; auch hier werden nur CPU32 und WIN32 erkannt.
Also, es müssen 64-Bit-Prozessor und -Windows vorhanden sein (das eine bedingt das andere, aber nicht umgekehrt), um auch 64 Bit zu erkennen, und dann werden logischerweise auch beide für die 64 Bit zuständigen Compilerschalter berücksichtigt. Sobald nur eines davon 32 Bit ist oder wenn FPC mit 32 Bit verwandt wird, sind nur die 32-Bit relevant.
Mathematisch kann man das auch so ausdrücken, daß hier zwei Äquivalenzen ("genau dann, wenn") vorliegen:
CPU32 <-> WIN32
CPU64 <-> WIN64
oder anders, daß die Lösungsmengen dieser Erkennungsfunktionen identisch sind.
Ist es also wirklich egal, ob man auf CPU oder auf WIN prüft, sind also zwei Schalter redundat? Oder gibt es einen Denkfehler meinerseits?
Vielen Dank im voraus und Grüße
Delphi-Laie
Weiß jemand, warum es für CPU-Bitbreite und Windows-Bitversion verschiedene Compilerschalter gibt (s. Betreff)?
Mich beschäftigt, ob man damit überhaupt zu unterschiedlichen Ergebnissen kommen kann.
Es ist klar, daß Win64 nur auf auf CPU64 ausgeführt werden kann, so daß, wenn man auf Win64 prüft, stattdessen auch CPU64 nehmen könnte.
Doch gilt das auch umgekehrt, kann man also statt CPU64 auch WIN64 verwenden, oder wird eine 64-Bit-CPU auch mit 32-Bit-Software (32-Bit-FPC oder damit erstellte Compilate) erkannt?
Dazu experimentierte ich folgendes:
1. 32-Bit-FPC auf Windows 32 Bit mit 64-Bit-System (also mit 64-Bit-Prozessor), dort werden nur CPU32 und WIN32 erkannt
2. 32-Bit-FPC auf Windows 64 Bit; auch hier werden nur CPU32 und WIN32 erkannt.
Also, es müssen 64-Bit-Prozessor und -Windows vorhanden sein (das eine bedingt das andere, aber nicht umgekehrt), um auch 64 Bit zu erkennen, und dann werden logischerweise auch beide für die 64 Bit zuständigen Compilerschalter berücksichtigt. Sobald nur eines davon 32 Bit ist oder wenn FPC mit 32 Bit verwandt wird, sind nur die 32-Bit relevant.
Mathematisch kann man das auch so ausdrücken, daß hier zwei Äquivalenzen ("genau dann, wenn") vorliegen:
CPU32 <-> WIN32
CPU64 <-> WIN64
oder anders, daß die Lösungsmengen dieser Erkennungsfunktionen identisch sind.
Ist es also wirklich egal, ob man auf CPU oder auf WIN prüft, sind also zwei Schalter redundat? Oder gibt es einen Denkfehler meinerseits?
Vielen Dank im voraus und Grüße
Delphi-Laie
Zuletzt geändert von Delphi-Laie am Fr 31. Dez 2010, 18:30, insgesamt 1-mal geändert.
-
- Beiträge: 308
- Registriert: Do 9. Apr 2009, 10:10
- OS, Lazarus, FPC: Ubuntu 9.10 (L 0.9.28 FPC 2.2.4)
- CPU-Target: 32Bit
- Wohnort: 785..
Re: Warum diverse Compilerschalter CPU32/WIN32 und CPU64/WIN64?
In deiner komplizierten Darstellung hast du wohl noch vergessen, dass kein 64-Bit Betriebssystem mit einer 32-Bit CPU betrieben werden sollte.
Ubuntu 9.10 (L 0.9.28 FPC 2.4.x)
-
- Lazarusforum e. V.
- Beiträge: 3178
- Registriert: Di 22. Jul 2008, 19:27
- OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
- CPU-Target: 32bit x86 armhf
- Wohnort: Köln
- Kontaktdaten:
Re: Warum diverse Compilerschalter CPU32/WIN32 und CPU64/WIN64?
Es gibt beim Compilieren von Quellcode ganz grob gesehen zwei Punkte die du berücksichtigen musst:
Du solltest also auf das richtige Symbol im richtigen Zusammenhang testen.
(CPU64 ∧ WINDOWS) <-> WIN64
(CPU32 ∧ WINDOWS) <-> WIN32
Richtig ist aber, dass ein 32bit-Programm auch unter einem 64bit-Betriebssystem ein 32bit-Programm bleibt.
- Die Zielarchitektur
- Das Zielbetriebssystem
Du solltest also auf das richtige Symbol im richtigen Zusammenhang testen.
Nicht ganz; es gibt immer noch Kombinationen anderer Betriebssysteme mit diesen Architekturen:Delphi-Laie hat geschrieben:Mathematisch kann man das auch so ausdrücken, daß hier zwei Äquivalenzen ("genau dann, wenn") vorliegen:
CPU32 <-> WIN32
CPU64 <-> WIN64
(CPU64 ∧ WINDOWS) <-> WIN64
(CPU32 ∧ WINDOWS) <-> WIN32
Richtig ist aber, dass ein 32bit-Programm auch unter einem 64bit-Betriebssystem ein 32bit-Programm bleibt.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
-
- Beiträge: 26
- Registriert: So 24. Jan 2010, 21:56
Re: Warum diverse Compilerschalter CPU32/WIN32 und CPU64/WIN64?
Besten Dank für diesen Hinweis! Das war mir natürlich nicht bekannt, so daß ich diese Essentialität in meinen vorigen Beitrag nicht mit aufnehmen konnte - ich gelobe Besserung!u-boot hat geschrieben:In deiner komplizierten Darstellung hast du wohl noch vergessen, dass kein 64-Bit Betriebssystem mit einer 32-Bit CPU betrieben werden sollte.
++++++++++++++++++++++++++++++++
Hallo Socke, Dir Dank für Deine Mühe!
Das ist natürlich bekannt.Socke hat geschrieben:Es gibt beim Compilieren von Quellcode ganz grob gesehen zwei Punkte die du berücksichtigen musst:Ein x86 kann nur 32-Bit Code ausführen, nicht aber 64bit-Code. Ein x86_64 kann sowohl 64- als auch 32-Bit-Code ausführen.
- Die Zielarchitektur
- Das Zielbetriebssystem
Ja, das tat ich ausführlich, mit dem Ergebnis, daß die Ausgabemengen beider identisch sind.Socke hat geschrieben:Du solltest also auf das richtige Symbol im richtigen Zusammenhang testen.
Nunja, die 64 Bit Hardware nützen jedoch nicht nur nichts mit 32 Bit, sie werden auch gar nicht erkannt - entweder, weil es gar nicht möglich ist, oder zur Sicherheit, denn was soll es, auf diesem Meßergebnis aufbauend, zu versuchen, irgendwelche 64-Bit-Routinen aufzurufen? Also, wenn, dann werden die 64 Bit sowohl bei Architektur als auch beim Betriebsprogramm immer gemeinsam erkannt (auch wenn sie, zum x. Male nun, nicht gemeinsam vorliegen müssen).Socke hat geschrieben:Nicht ganz; es gibt immer noch Kombinationen anderer Betriebssysteme mit diesen Architekturen:Delphi-Laie hat geschrieben:Mathematisch kann man das auch so ausdrücken, daß hier zwei Äquivalenzen ("genau dann, wenn") vorliegen:
CPU32 <-> WIN32
CPU64 <-> WIN64
(CPU64 ∧ WINDOWS) <-> WIN64
(CPU32 ∧ WINDOWS) <-> WIN32
FPC hat - im Gegensatz zu Delphi - den Riesenvorteil, für beide Bitbreiten verfügbar zu sein. Wie kann demnach ein (gemeinsamer) Quelltext geschaffen werden, der bei einem 32-Bit-Compilat 32 oder 64 Bit oder bei einem 64-Bit-Compilat nur die 64 Bit (logischerweise) erkennt, bei der also beide Compilate die jeweils richtige Bitumgebung identifizieren?
Angelangt und dann gestolpert bin ich über die "IsWow64"-Funktion von Windows, die als 64-Bit-Pendant nicht funktionieren wollte, was auch nicht möglich ist, wie mir später klarwurde, weil ja kein 32-Bit-Emulator verwendet wird. Hier mein vorläufiges, anscheinend funktionierendes Ergebnis:
Code: Alles auswählen
function Is64Bit:Boolean;
type TIsWow64Process=function(Handle:Windows.THandle;var Res:Windows.BOOL):Windows.BOOL;stdcall;
{$IFDEF WIN32}//alternativ:{$IFDEF CPU32}?
var
IsWow64Result:Windows.BOOL;// Result from IsWow64Process
IsWow64Process:{^}TIsWow64Process;// IsWow64Process fn reference
{$ENDIF}
begin
{$IFDEF WIN32}//alternativ:{$IFDEF CPU32}?
IsWow64Result:=false;//nur, damit der Compiler nicht meckert
Pointer(IsWow64Process):=Windows.GetProcAddress(Windows.GetModuleHandle('kernel32'),'IsWow64Process');// Try to load required function from kernel32
if Assigned(IsWow64Process) then
begin
//Function is implemented:call it
if not IsWow64Process(Windows.GetCurrentProcess,IsWow64Result) then raise SysUtils.Exception.Create('IsWow64:bad process handle');
Result:=IsWow64Result
end
else Result:=False //Function not implemented: can't be running on Wow64
{$ENDIF}
{$IFDEF WIN64}//alternativ:{$IFDEF CPU64} oder auch {$ELSE}, aber was ist, wenn es einmal 128 Bit geben wird?
Result:=true
{$ENDIF}
end;
-
- Lazarusforum e. V.
- Beiträge: 3178
- Registriert: Di 22. Jul 2008, 19:27
- OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
- CPU-Target: 32bit x86 armhf
- Wohnort: Köln
- Kontaktdaten:
Re: Warum diverse Compilerschalter CPU32/WIN32 und CPU64/WIN64?
Es ist nicht möglich auf einem 32bit-System ein Programm für eine 64bit-Architektur zu erstellen. Du willst also herausfinden, ob ein 32bit-Programm unter einem 64bit-Windows läuft?Delphi-Laie hat geschrieben:Nunja, die 64 Bit Hardware nützen jedoch nicht nur nichts mit 32 Bit, sie werden auch gar nicht erkannt - entweder, weil es gar nicht möglich ist, oder zur Sicherheit, denn was soll es, auf diesem Meßergebnis aufbauend, zu versuchen, irgendwelche 64-Bit-Routinen aufzurufen? Also, wenn, dann werden die 64 Bit sowohl bei Architektur als auch beim Betriebsprogramm immer gemeinsam erkannt (auch wenn sie, zum x. Male nun, nicht gemeinsam vorliegen müssen).
FPC hat - im Gegensatz zu Delphi - den Riesenvorteil, für beide Bitbreiten verfügbar zu sein. Wie kann demnach ein (gemeinsamer) Quelltext geschaffen werden, der bei einem 32-Bit-Compilat 32 oder 64 Bit oder bei einem 64-Bit-Compilat nur die 64 Bit (logischerweise) erkennt, bei der also beide Compilate die jeweils richtige Bitumgebung identifizieren?
Wenn es in ferner Zukunft einmal 128bit-Prozessoren gibt (und sich noch jemand für den FPC auf dieser Architektur interessiert), wäre es möglich, dass dann ein CPU128-Flag vom Compiler gesetzt wird. Irgendwo in der Dokumentation taucht auch noch ein CPU16 auf, auch wenn es de facto keine 16bit-Unterstützung gibt. In deinem Code ist IFDEF WIN32 die richtige Frage an den Compiler, da du den Code nur unter Windows auf x86 ausführen willst.Delphi-Laie hat geschrieben:Angelangt und dann gestolpert bin ich über die "IsWow64"-Funktion von Windows, die als 64-Bit-Pendant nicht funktionieren wollte, was auch nicht möglich ist, wie mir später klarwurde, weil ja kein 32-Bit-Emulator verwendet wird. Hier mein vorläufiges, anscheinend funktionierendes Ergebnis:Code: Alles auswählen
{$IFDEF WIN64}//alternativ:{$IFDEF CPU64} oder auch {$ELSE}, aber was ist, wenn es einmal 128 Bit geben wird? Result:=true {$ENDIF} end;
Dein Funktionsname Is64Bit scheint allerdings mir ein wenig unglücklich gewählt, da es dir ausschließlich um das Betriebssystem geht. Ein 32bit-Betriebssystem wird dir nie sagen, dass es auf einem 64bit-Prozessor läuft, auch wenn dieser das unterstützt.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
-
- Beiträge: 1102
- Registriert: Di 5. Aug 2008, 09:37
- OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
- CPU-Target: 32/64,PPC(+64), ARM
- Wohnort: Eindhoven (Niederlande)
Re: Warum diverse Compilerschalter CPU32/WIN32 und CPU64/WIN64?
Denke auch daran das CPU64 <> x86_64 ist. Mein Mac G5 (powerpc64) hat auch "CPU64"
CPU64 meint nur das sizeof(pointer)=8; der Rest ist OS und exakte CPU abhängig.
Lese auch mal http://www.stack.nl/~marcov/buildfaq/#toc-Section-5.1" onclick="window.open(this.href);return false;
CPU64 meint nur das sizeof(pointer)=8; der Rest ist OS und exakte CPU abhängig.
Lese auch mal http://www.stack.nl/~marcov/buildfaq/#toc-Section-5.1" onclick="window.open(this.href);return false;
-
- Beiträge: 26
- Registriert: So 24. Jan 2010, 21:56
Re: Warum diverse Compilerschalter CPU32/WIN32 und CPU64/WIN64?
Danke, Socke!
Hallo Marcov, auch Dir danke!
Lese auch mal http://www.stack.nl/~marcov/buildfaq/#toc-Section-5.1" onclick="window.open(this.href);return false;[/quote]
Gut, dann deckt sich das ja mit den Ergebnissen meiner Experimente, die das gewissermaßen auch so aussagten.Socke hat geschrieben:Es ist nicht möglich auf einem 32bit-System ein Programm für eine 64bit-Architektur zu erstellen.
Ob auf 32 oder auf 64 Bit, und zusätzlich soll das quelltextidentische 64-Bit-Compilat von vornherein wissen, daß es auf 64 Bit läuft. Mit meiner Fummellösung müßte das alles gewährleistet sein.Delphi-Laie hat geschrieben:Du willst also herausfinden, ob ein 32bit-Programm unter einem 64bit-Windows läuft?
Das waren meine in den Quelltext geschriebenen Gedankengänge, die theoretischer Natur waren, und eigentlich auch vor Veröffentlichung besser hätten gelöscht werden sollen. 128 Bit sind nicht in mittelnaher Sichtweite.Socke hat geschrieben:Wenn es in ferner Zukunft einmal 128bit-Prozessoren gibt (und sich noch jemand für den FPC auf dieser Architektur interessiert), wäre es möglich, dass dann ein CPU128-Flag vom Compiler gesetzt wird. Irgendwo in der Dokumentation taucht auch noch ein CPU16 auf, auch wenn es de facto keine 16bit-Unterstützung gibt. In deinem Code ist IFDEF WIN32 die richtige Frage an den Compiler, da du den Code nur unter Windows auf x86 ausführen willst.
Einfach kopiert und erstmal nicht weiter darüber nachgedacht, sondern mich anderen Schwerpunkten zugewandt. Er ist aber auch nicht falsch, hätte allerdings auch konkreter Is64BitWindows heißen können.Socke hat geschrieben:Dein Funktionsname Is64Bit scheint allerdings mir ein wenig unglücklich gewählt, da es dir ausschließlich um das Betriebssystem geht.
Ja, so waren die Ergebnisse auch. Allerdings kann man über den "Trick" wenigstens ein 32-Bit-Programm erfahren, wenn es unter 64 Bit läuft und sein Verhalten entsprechen anpassen/variieren.Socke hat geschrieben:Ein 32bit-Betriebssystem wird dir nie sagen, dass es auf einem 64bit-Prozessor läuft, auch wenn dieser das unterstützt.
Hallo Marcov, auch Dir danke!
Guter Gedankengang! Allerdings ist mein Programm, für das ich das benötige, nur ein windows-kompatibles Compilat, so daß eben wohl doch WIN64=CPU64 ist (oder zumindst sein müßte).marcov hat geschrieben:Denke auch daran das CPU64 <> x86_64 ist. Mein Mac G5 (powerpc64) hat auch "CPU64"
Das fand ich auch schon, allerdings funktioniert das nur für die "Bittigkeit" desselben Programmes. Ein 32-Bit-Programm hat auf Windows 64 Bit eben auch nur einen 4-Byte-Pointer.marcov hat geschrieben:CPU64 meint nur das sizeof(pointer)=8; der Rest ist OS und exakte CPU abhängig.
Lese auch mal http://www.stack.nl/~marcov/buildfaq/#toc-Section-5.1" onclick="window.open(this.href);return false;[/quote]
Zuletzt geändert von Delphi-Laie am Sa 1. Jan 2011, 21:28, insgesamt 1-mal geändert.
-
- Lazarusforum e. V.
- Beiträge: 3178
- Registriert: Di 22. Jul 2008, 19:27
- OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
- CPU-Target: 32bit x86 armhf
- Wohnort: Köln
- Kontaktdaten:
Re: Warum diverse Compilerschalter CPU32/WIN32 und CPU64/WIN64?
Jetzt bin ich aber gespannt! Inwiefern kann man denn da das Verhalten sinnvoll verändern (ich meine jetzt nicht Funktional dem Benutzer gegenüber)?Delphi-Laie hat geschrieben:Ja, so waren die Ergebnisse auch. Allerdings kann man über den "Trick" wenigstens ein 32-Bit-Programm erfahren, wenn es unter 64 Bit läuft und sein Verhalten entsprechen anpassen/variieren.Socke hat geschrieben:Ein 32bit-Betriebssystem wird dir nie sagen, dass es auf einem 64bit-Prozessor läuft, auch wenn dieser das unterstützt.
Ein 32bit-Programm wird nie einen echten Zeiger mit einer anderen Größe als 4 Byte haben. Ein 64bit-Betriebssystem stellt auch 32bit-Programmen gegenüber als 32bit-Betriebssystem dar (außer es gibt eine API, aber die ist nur eine BehauptungDelphi-Laie hat geschrieben:Das fand ich auch schon, allerdings funktioniert das nur für die "Bittigkeit" desselben Programmes. Ein 32-Bit-Programm hat auf Windows 64 Bit eben auch nur einen 4-Byte-Pointer.marcov hat geschrieben:CPU64 meint nur das sizeof(pointer)=8; der Rest ist OS und exakte CPU abhängig.

MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
-
- Beiträge: 26
- Registriert: So 24. Jan 2010, 21:56
Re: Warum diverse Compilerschalter CPU32/WIN32 und CPU64/WIN64?
Das sollst Du als kleines Dankeschön gern erfahren. Mir ging es nur um einen Fall. Und zwar kann man die API-Funktion "SetThreadIdealProcessor" auch nur lesend benutzen (was der Funktionsname nicht gerade verrät), wenn man ihr für den lesenden und (normalerweise auch geschriebenen) Parameter (für Pascal lernte ich dafür einmal die Bezeichnung "Variablenparameter", wenn ich mich recht entsinne) "dwIdealProcessor" den Wert "MAXIMUM_PROCESSORS" übergibt. Hm, wie groß muß der sein, wo findet man etwas dazu? Mikroweichs API-Referenz ist leider auch hier ein Quentchen zu oberflächlich. Schließlich fand ich hier des Rätsels hoffentlich stimmige Lösung: 32 für 32 und 64 für 64 Bit. Da die Prozessoren von 0 bis n-1 gezählt werden, ist dieser Wert plausibel. Sicher ist ein 32-Bit-Programm unter 64 Bit funktionseingeschränkt, aber das Ändern des Idealprozessors (neben anderen Dingen wie Ändern der Prioriät und der Affinitätsmaske sowie das Beenden von Prozessen und Threads) könnte es für Programme, die nicht in der sog. "Service Session" laufen, noch erreichen ("hinbekommen").Socke hat geschrieben:Jetzt bin ich aber gespannt! Inwiefern kann man denn da das Verhalten sinnvoll verändern (ich meine jetzt nicht Funktional dem Benutzer gegenüber)?
Also, meine Lazaruscompilate, egal, ob 32 oder 64 Bit, sollen maximale Funktionalität haben, was erfordert, daß ein 32-Bit-Compilat eben die Bittigkeit seiner Umgegung wahrnimmt und, davon abhängig, 32 oder 64 Bit in die o.a. API-Funktion sendet, während das 64-Bit-Compilat diesen "Umgebungsdetektor" nicht benötigt und zur Compilierungszeit gleich mit dem richtigen Rückgabewert bestückt wird.
Puh, das war aber vielleicht anstrengend.....
Edit: Soeben fiel mir ein, daß es auch ohne Compilerschalter möglich sein müßte: Pointergröße auf 8 überprüfen; falls ja, sind es 64 Bit, und falls nein, dann kann man immer noch auf die "IsWow64Process"-Umgebung überprüfen.
-
- Lazarusforum e. V.
- Beiträge: 3178
- Registriert: Di 22. Jul 2008, 19:27
- OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
- CPU-Target: 32bit x86 armhf
- Wohnort: Köln
- Kontaktdaten:
Re: Warum diverse Compilerschalter CPU32/WIN32 und CPU64/WIN64?
Es geht also um den Wert einer Konstante. Wenn die irgendwo nur mit Namen genannt werden, kann man davon ausgehen, dass sie in einer Windows-Header-Datei deklariert sind. Also: SDK herunterladen und mit Lazarus ein "In Dateien suchen..." ausführen. Google findet zwar nicht die offiziellen Microsoft-Header, aber die des WINE-Projektes.
Ausgehen von der Tatsache, dass die Konstante MAXIMUM_PROCESSORS in der Unit jwawinnt.pas deklariert ist, habe ich geraten, dass sie für C in winnt.h definiert sein müsste und habe deine Annahme aus einem anderen Internetforum verifizieren können.
Die Funktion SetThreadIdealProcessor ist bereits in der Unit JwaWinBase.pas deklariert (sogar richtig).
Edit: Ich habe mir einmal die Freiheit genommen und einen Bug-Report verfasst.
Ausgehen von der Tatsache, dass die Konstante MAXIMUM_PROCESSORS in der Unit jwawinnt.pas deklariert ist, habe ich geraten, dass sie für C in winnt.h definiert sein müsste und habe deine Annahme aus einem anderen Internetforum verifizieren können.
Die Funktion SetThreadIdealProcessor ist bereits in der Unit JwaWinBase.pas deklariert (sogar richtig).
Edit: Ich habe mir einmal die Freiheit genommen und einen Bug-Report verfasst.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
-
- Beiträge: 1102
- Registriert: Di 5. Aug 2008, 09:37
- OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
- CPU-Target: 32/64,PPC(+64), ARM
- Wohnort: Eindhoven (Niederlande)
Re: Warum diverse Compilerschalter CPU32/WIN32 und CPU64/WIN64?
Ja, und ein 8-bit Commodore 64-bit in emulator nur 16-bit indirekt via die Zero pageDelphi-Laie hat geschrieben:Das fand ich auch schon, allerdings funktioniert das nur für die "Bittigkeit" desselben Programmes. Ein 32-Bit-Programm hat auf Windows 64 Bit eben auch nur einen 4-Byte-Pointer.

Und das ist kein Witz. 32-bit Programme laufen auf 64-bit auch in eine Art Emulator (aber eine die fast unsonst ist) Gleich wie das Commodore 64 Programm nicht von win64 weißt, weißt auch das win32 Programm das nicht. Es sieht (meistens) nur der Emulator. (der heißt übrigens WOW, was für "Windows On Windows" steht)
-
- Lazarusforum e. V.
- Beiträge: 3178
- Registriert: Di 22. Jul 2008, 19:27
- OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
- CPU-Target: 32bit x86 armhf
- Wohnort: Köln
- Kontaktdaten:
Re: Warum diverse Compilerschalter CPU32/WIN32 und CPU64/WIN64?
Nicht ganz. Zumindest der Prozessor wird in den 32bit-Modus gesetzt und arbeitet dann nativ darin. Das Betriebssystem muss dann natürlich noch den Speicherzugriff abbilden. Soweit ich mich informiert habe...marcov hat geschrieben:Und das ist kein Witz. 32-bit Programme laufen auf 64-bit auch in eine Art Emulator (aber eine die fast unsonst ist) Gleich wie das Commodore 64 Programm nicht von win64 weißt, weißt auch das win32 Programm das nicht. Es sieht (meistens) nur der Emulator. (der heißt übrigens WOW, was für "Windows On Windows" steht)
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
-
- Beiträge: 1102
- Registriert: Di 5. Aug 2008, 09:37
- OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
- CPU-Target: 32/64,PPC(+64), ARM
- Wohnort: Eindhoven (Niederlande)
Re: Warum diverse Compilerschalter CPU32/WIN32 und CPU64/WIN64?
Also ein hardware unterstutzte CompilerSocke hat geschrieben:Nicht ganz. Zumindest der Prozessor wird in den 32bit-Modus gesetzt und arbeitet dann nativ darin. Das Betriebssystem muss dann natürlich noch den Speicherzugriff abbilden. Soweit ich mich informiert habe...marcov hat geschrieben:Und das ist kein Witz. 32-bit Programme laufen auf 64-bit auch in eine Art Emulator (aber eine die fast unsonst ist) Gleich wie das Commodore 64 Programm nicht von win64 weißt, weißt auch das win32 Programm das nicht. Es sieht (meistens) nur der Emulator. (der heißt übrigens WOW, was für "Windows On Windows" steht)

-
- Lazarusforum e. V.
- Beiträge: 3178
- Registriert: Di 22. Jul 2008, 19:27
- OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
- CPU-Target: 32bit x86 armhf
- Wohnort: Köln
- Kontaktdaten:
Re: Warum diverse Compilerschalter CPU32/WIN32 und CPU64/WIN64?
Wenn man als nativ die (undokumentierte) Native-API des Windows-Kernels betrachtet, ja.marcov hat geschrieben:Also ein hardware unterstutzte CompilerDie grenzen zwischen Emulation und "echt" sind nicht sehr hart. Man konnte fast alle Windows Programme als eine win32/64 Emulation über das NT api sehen.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
-
- Beiträge: 26
- Registriert: So 24. Jan 2010, 21:56
Re: Warum diverse Compilerschalter CPU32/WIN32 und CPU64/WIN64?
Danke, aber mit so etwas beschäftigte ich mich noch nie, und das ist mir jetzt zu aufwendig.Socke hat geschrieben:Es geht also um den Wert einer Konstante. Wenn die irgendwo nur mit Namen genannt werden, kann man davon ausgehen, dass sie in einer Windows-Header-Datei deklariert sind. Also: SDK herunterladen und mit Lazarus ein "In Dateien suchen..." ausführen. Google findet zwar nicht die offiziellen Microsoft-Header, aber die des WINE-Projektes.t.
Prima, dann stimmt das, was ich fand, also.Socke hat geschrieben:Ausgehen von der Tatsache, dass die Konstante MAXIMUM_PROCESSORS in der Unit jwawinnt.pas deklariert ist, habe ich geraten, dass sie für C in winnt.h definiert sein müsste und habe deine Annahme aus einem anderen Internetforum verifizieren können.
Wenn allerdings diese Konstante von der "Bittigkeit" des Betriebsprogrammes bzw. des Prozessors abhängig ist, dann stehen auch die FPC-Programmierer vor der Aufgabe, mit Kompilerschaltern den richtigen Wert dafür einzustellen (eine echte Konstante ist es damit aber übrigens nicht mehr, zumindest nicht im Quelltext, im Compilat natürlich schon noch).
Außerdem würde diese Konstante, weil mit Kompilerschaltern zur Laufzeit auf den richtigen Wert gebracht (bzw. der richtige Wert ausgewählt), bei einem 32-Bit-Compilat eben auch nicht den richtigen Wert dafür liefern, wenn dieses in einer 64-Bit-Umgebung läuft. Ergänzung: Mein voriger Satz ist evtl. falsch, es kann sein, daß es nichts bringt, in einem 32-Bit-Programm in einer 64-Bit-Umgebung der Funktion "SetThreadIdealProcessor" den 64-Bit-Maximum_Processors-Wert mitzugeben. Das werde ich noch versuchen herauszufinden.
Danke für den Hinweis! Ich übernahm einfach meine Delphi-Codeschnipsel in Lazarus, ohne an diese Möglichkeit überhaupt zu denken. In Delphi ist es ab Version 3 in der Unit "Windows" deklariert, leider wohl nicht ganz richtig, jedenfalls wird der durchaus wichtige integre Rückgabewert zu einem schnöden "bool" verkürzt.Socke hat geschrieben:Die Funktion SetThreadIdealProcessor ist bereits in der Unit JwaWinBase.pas deklariert (sogar richtig).
Prima, danke, und was für ein Glück Du doch hast, daß das schon erstmalig bearbeitet wurde! Ich warte immer noch darauf, daß mein jüngster Bugreport dort, der immerhin schon aus dem letzten Jahrzehnt stammt, überhaupt wenigstens nach außen sichtbar zur Kenntnis genommen (bzw. wahrgenommen) wird.Socke hat geschrieben:Edit: Ich habe mir einmal die Freiheit genommen und einen Bug-Report verfasst.