64 bit oder 32 bit auslesen ?
-
@Hi: Das ist ja wohl Unfug!
Grund: Weil es auf einem 64bit deutschem XP voll in die Hose geht.
IsWow64Process http://msdn.microsoft.com/en-us/library/ms684139(VS.85).aspx
Ist der einzig richtige Weg.Ein vollständiges Codesample findet sich hier:
http://blogs.msdn.com/b/oldnewthing/archive/2005/02/01/364563.aspx
-
Martin Richter schrieb:
@Hi: Das ist ja wohl Unfug!
Grund: Weil es auf einem 64bit deutschem XP voll in die Hose geht.
Nein! Und das ist getestet!
-
Sorry haste recht!
-
CStoll schrieb:
If the process is a 64-bit application running under 64-bit Windows, the value is also set to FALSE.
(wobei: Die Frage, ob das Programm als 32- oder 64-Bit übersetzt wurde, müsste der Compiler bereitstellen können)
Was willst Du mir damit sagen????
Das ein 64-Bit Prozess zuerst mal selber feststellen muss, ob er auf einem 64-Bit OS läuft!? Denk mal ganz genau über diese Frage nach, dann wirst Du erkennen, das die Antwort auch ohne Aufruf von "IsWow64Process" glasklar ist...
-
Die Frage ist, ob das Programm auf einer 64-Bit-Version von Windows läuft, unabhängig vom Programm selbst.
Die Antwort liefert die Funktion GetNativeSystemInfo.
Diese Funktion gibt es ab Windows 2000. Wenn sie fehlt, kann es also auch kein 64-Bit Windows sein:BOOL Is64BitWindows() { typedef void (WINAPI *PGETNATIVESYSTEMINFO)(LPSYSTEM_INFO); PGETNATIVESYSTEMINFO pGNSI = (PGETNATIVESYSTEMINFO)GetProcAddress( GetModuleHandle(_T("kernel32.dll")), "GetNativeSystemInfo"); if (pGNSI) { SYSTEM_INFO si; pGNSI(&si); switch (si.wProcessorArchitecture) { case PROCESSOR_ARCHITECTURE_AMD64: case PROCESSOR_ARCHITECTURE_IA64: return TRUE; } } return FALSE; }
-
Was soll denn dieser blödsinn?
Die IsWow64Process funktion reicht vollkommen aus (natürlich auch via LoadLibrary/GetProcAddress aufgerufen).Wen nich selber ein 64-Bit Prozess bin, dann brauch ich nicht noch fragen ob ich auf einem 64-Bit OS ausgeführt werde!!! Wenn ich zu dieser Frage hinkomme, dann muss es ja ein 64-Bit Prozesss ein, sonst würde ich ja gar nicht laufen! Oder hast Du schon mal ein 64-Bit Prozess auf einem 32-Bit OS zum laufen bekommen?
-
Ich gehe auch davon aus, dass es ein 32-Bit Programm ist, sonst wäre die ursprüngliche Frage sinnlos.
Der Aufruf von GetNativeSystemInfo liefert genau die gefragte Information.
Die Lösung als "Blödsinn" zu bezeichnen ist unangemessen.Die Frage, ob das Programm im WOW64-Emulator ausgeführt wird, ist nicht gleichbedeutend damit, ob es sich um ein 64-Bit Windows handelt.
Vielleicht wird es später mal einen WOW128 Emulator geben.
-
Jochen Kalmbach schrieb:
CStoll schrieb:
If the process is a 64-bit application running under 64-bit Windows, the value is also set to FALSE.
(wobei: Die Frage, ob das Programm als 32- oder 64-Bit übersetzt wurde, müsste der Compiler bereitstellen können)
Was willst Du mir damit sagen????
Das ein 64-Bit Prozess zuerst mal selber feststellen muss, ob er auf einem 64-Bit OS läuft!? Denk mal ganz genau über diese Frage nach, dann wirst Du erkennen, das die Antwort auch ohne Aufruf von "IsWow64Process" glasklar ist...
Ich wollte darauf hinaus, was das von Martin verlinkte Code-Beispiel erklärt hat - du kannst den selben Quelltext (eventuell mit ein paar Detail-Änderungen) als 32-Bit- oder 64-Bit-Anwendung übersetzen und im letzteren Fall liefert die IsWow64Process false.
-
Wenn man seine App als x64 übersetzt und auf einem x64 OS laufen lässt (auf einem x86 kann man es ja nicht), dann *muss* "IsWow64Process" auch *false* zurückgeben, da der Prozess nicht unter dem "Wow" (Windows (x86) on Windows x64) läuft, sondern als nativer x64 Prozess auf einem x64 OS.
Es ist also _richtig_ das false zurückgeliefert wird.
-
Jochen Kalmbach schrieb:
Wenn man seine App als x64 übersetzt und auf einem x64 OS laufen lässt (auf einem x86 kann man es ja nicht), dann *muss* "IsWow64Process" auch *false* zurückgeben, da der Prozess nicht unter dem "Wow" (Windows (x86) on Windows x64) läuft, sondern als nativer x64 Prozess auf einem x64 OS.
Ja, aus Sicht der Funktion mag das ja stimmen. Die Frage ist nur, ob es das ist, was der Thread-Starter wissen wollte.
-
Dann würde ich aber lieber gar keine Funktion aufrufen, wenn für 64 Bit kompiliert wird. Den Aufwand mit GetNativeSystemInfo würde ich nicht treiben.
BOOL Is64() { #ifdef _WIN64 return TRUE; #else BOOL bIs64 = FALSE; //IsWow64Process is not available on all supported versions of Windows. //Use GetModuleHandle to get a handle to the DLL that contains the function //and GetProcAddress to get a pointer to the function if available. fnIsWow64Process = (LPFN_ISWOW64PROCESS) GetProcAddress( GetModuleHandle(TEXT("kernel32")),"IsWow64Process"); if(NULL != fnIsWow64Process) { if (!fnIsWow64Process(GetCurrentProcess(),&bIs64)) { //handle error } } return bIs64; #endif }
-
Eben. Und auch auf diesen Code wurde bereits hingewiesen (siehe Link auf Old-New-Thing).
-
Woher soll ich das wissen? Das ist ein blog, und blogs lese ich nicht. Blogger sind gescheiterte Existenzen mit gesteigertem Mitteilungs-Bedürfnis. Die werde ich in diesem Leben sicher nicht noch therapieren.
-
Mox schrieb:
Dann würde ich aber lieber gar keine Funktion aufrufen, wenn für 64 Bit kompiliert wird.
Was für einen Sinn sollte denn so eine Funktion machen. wenn Du als x64 compiliert hast??????
Dein Prozess wird nicht laufen, wenn es nicht auf einem 64 Bit OS läuft...
Und ja, wenn es auch einem 128-Bit System laufen sollte, was sollte es dann bringen, wenn Du dies wüsstest?
PS: Und was bringt es Dir wenn Du das ganze für ein x86 Programm weißt?
-
Ich würde das so machen:
In einem 64bit System sind die Adressen 64bit, das heißt 8 Byte groß.
Das kann ich doch mitif( sizeof(void*) == 8 ){ jo 64bit Programm; }
testen.
Das sollte auch auf allen anderen Betriebsystemen gehen.
Grüße, Peter
-
@chefpro
Da ist das Ergebnis doch von den Compilereinstellungen abhängig (32 oder 64 build)?!
-
chefpro schrieb:
Ich würde das so machen:
In einem 64bit System sind die Adressen 64bit, das heißt 8 Byte groß.
Das kann ich doch mitif( sizeof(void*) == 8 ){ jo 64bit Programm; }
testen.
Das sollte auch auf allen anderen Betriebsystemen gehen.
Grüße, Peter
Ja Compiletime. Für Runtime ist das BS.