Wie kann ich Informationen über den Windows-Betriebssystemtyp erhalten? Ist es 32bit oder 64bit? Wie kann ich diese Informationen programmatisch erhalten?Wie bekomme ich Informationen über den Computer? [32bit oder 64bit]
Antwort
Sie müssen GetProcAddress()
verwenden, um die Verfügbarkeit der IsWow64Process()
Funktion zur Laufzeit zu prüfen, etwa so:
function Is64BitWindows: boolean;
type
TIsWow64Process = function(hProcess: THandle; var Wow64Process: BOOL): BOOL;
stdcall;
var
DLLHandle: THandle;
pIsWow64Process: TIsWow64Process;
IsWow64: BOOL;
begin
Result := False;
DllHandle := LoadLibrary('kernel32.dll');
if DLLHandle <> 0 then begin
pIsWow64Process := GetProcAddress(DLLHandle, 'IsWow64Process');
Result := Assigned(pIsWow64Process)
and pIsWow64Process(GetCurrentProcess, IsWow64) and IsWow64;
FreeLibrary(DLLHandle);
end;
end;
da diese Funktion nur unter Windows-Versionen ist, die einen 64-Bit-Geschmack verfügen. Wenn Sie es als external
deklarieren, würde Ihre Anwendung unter Windows 2000 oder Windows XP vor SP2 nicht ausgeführt werden.
Edit:
Chris hat einen Kommentar über das Caching das Ergebnis aus Performance-Gründen gebucht. Dies ist möglicherweise nicht notwendig für diese bestimmte API-Funktion, weil kernel32.dll wird immer da sein (und ich kann mir nicht vorstellen, ein Programm, das würde sogar ohne es), aber für andere Funktionen können die Dinge anders sein. Also hier ist eine Version, die die Funktion Ergebnis Caches:
function Is64BitWindows: boolean;
type
TIsWow64Process = function(hProcess: THandle; var Wow64Process: BOOL): BOOL;
stdcall;
var
DLLHandle: THandle;
pIsWow64Process: TIsWow64Process;
const
WasCalled: BOOL = False;
IsWow64: BOOL = False;
begin
if not WasCalled then begin
DllHandle := LoadLibrary('kernel32.dll');
if DLLHandle <> 0 then begin
pIsWow64Process := GetProcAddress(DLLHandle, 'IsWow64Process');
if Assigned(pIsWow64Process) then
pIsWow64Process(GetCurrentProcess, IsWow64);
WasCalled := True;
FreeLibrary(DLLHandle);
end;
end;
Result := IsWow64;
end;
diese Funktion Ergebnis Caching sicher ist, da die API-Funktion entweder da sein wird oder nicht, und das Ergebnis kann nicht auf der gleichen Windows-Installation ändern. Es ist sogar sicher, dies gleichzeitig von mehreren Threads aus aufzurufen, da zwei Threads, die WasCalled
als False
finden, beide die Funktion aufrufen, dasselbe Ergebnis an den gleichen Speicherort schreiben und danach nur WasCalled
auf True
setzen.
Es wird eine gute Idee sein, das Ergebnis zwischenzuspeichern, wenn das Programm die Antwort mehrmals kennen muss. Das heißt, Sie möchten dies nicht in einer Schleife aufrufen, da LoadLibrary teuer sein wird, besonders wenn es nichts findet. Ich klopfe nicht die Lösung an, sondern gebe nur einen Hinweis auf den Anwendungsfall. –
Dieser Code wird nur kompiliert, wenn zuweisbare/schreibbare Konstanten in den Projekteinstellungen aktiviert sind. Um zu vermeiden, dass diese Compilereinstellung empfindlich ist, führen Sie entweder Anweisungen ein, um sicherzustellen, dass das Verhalten des Compilers für diesen Code festgelegt (und wiederhergestellt) wird. Oder besser, ich würde vorschlagen, eine Unit-Variable für das zwischengespeicherte Ergebnis zu verwenden Sie müssen zwei solche Variablen verwenden: zB deklariere initialisiert = -1 für "nicht gesetzt", setze = 0 für Win32 setze = 1 für Win64). – Deltics
Wenn a) Sie auf Windows und b) Sie auf die Registrierung zugreifen können, dann sollte HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion informativ sein.
Ich weiß nicht, wie Sie Win32-Funktion in Delphi aufrufen.
Aber wenn Sie ein 32-Bit-Programm schreiben, können Sie die Win32 API IsWow64Process aufrufen, um zu wissen, ob Sie in einem 64-Bit-Betriebssystem sind.
Natürlich, wenn Sie eine 64-Bit-Exe schreiben, wird es nur auf 64-Bit-Windows ausgeführt, so dass Sie nicht fragen müssen.
Viel Glück beim Schreiben einer 64-Bit-Exe mit Delphi. ;) – Deltics
Mach es gerade jetzt. (2015) – penarthur66
function IsWin64: Boolean;
var
IsWow64Process : function(hProcess : THandle; var Wow64Process : BOOL): BOOL; stdcall;
Wow64Process : BOOL;
begin
Result := False;
IsWow64Process := GetProcAddress(GetModuleHandle(Kernel32), 'IsWow64Process');
if Assigned(IsWow64Process) then begin
if IsWow64Process(GetCurrentProcess, Wow64Process) then begin
Result := Wow64Process;
end;
end;
end;
Neben IsWow64Process
, die GetNativeSystemInfo API-Funktion für Sie von Interesse (es ist definiert in der Windows
Einheit) sein können, auf mehr über die CPU Sie haben, um herauszufinden, (oder Sie können Montage und CPUID
verwenden).
// nicht getestet, aber u kann versuchen, diese
is64 := (Environment.GetEnvironmentVariable('ProgramW6432') <> '');
Diese Frage ist mit "delphi" gekennzeichnet und hat keine Erwähnung von .net oder Java. Daher können Sie nicht davon ausgehen, dass "Umgebung" verfügbar ist. Bitte lesen Sie die Tags, bevor Sie Fragen beantworten, um sicherzustellen, dass Ihre Antwort auf sie zutrifft. Wenn Sie nicht sicher sind, sollten Sie die Frage wahrscheinlich nicht beantworten. :-) –
Ein Delphi-Codierer würde dorthin kommen und bemerken, dass es eine definierte Objektumgebung haben muss, deshalb wird er sie einfach entfernen: is64: = ({Environment.} GetEnvironmentVariable ('ProgramW6432') <> ''); danke! –
für delphi XE +
Uses System.SysUtils
Function IsWin64Or32: string;
Begin
if Pos('64-bit', TOSVersion.ToString) > 0 then
Result := '64-bit'
Else
Result := '32-bit';
End;
Beispiel
lbl1.Caption := IsWin64Or32;
function TForm2.Arch: string;
begin
if TOSVersion.Architecture=arIntelX86 then
Result := '32-bit' Else Result := '64-bit'
end;
TOSVersion wurde auf XE2 eingeführt, die Frage betrifft Delphi 2007. – bummi
"compiuter"? "about"? "Programm"? Bitte nehmen Sie sich die Zeit, Ihre Frage zu lesen, bevor Sie sie posten. –
@Joachim Sauer: StackOverflow ist ein internationales Forum und man kann von keinem perfekten Englisch erwarten - nur die ärgerlichen Grammatikfehler beheben. – kludg
@Serg: unvollständig Englisch und einfache Tippfehler sind zwei verschiedene Dinge. Ich bin mir ziemlich sicher, dass "about" Letzteres ist. Ich habe überhaupt kein Problem mit unvollkommenem Englisch (ich bin selbst kein Muttersprachler). –