2010-03-26 8 views
7

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]

+2

"compiuter"? "about"? "Programm"? Bitte nehmen Sie sich die Zeit, Ihre Frage zu lesen, bevor Sie sie posten. –

+4

@Joachim Sauer: StackOverflow ist ein internationales Forum und man kann von keinem perfekten Englisch erwarten - nur die ärgerlichen Grammatikfehler beheben. – kludg

+1

@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). –

Antwort

6

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.

+0

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. –

+2

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

3

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.

+0

Sorry, aber keine Registrierung. Ich verwende Windows – gedO

+5

@gedO: Sie widersprechen sich. Windows bedeutet Registrierung. Versuchen Sie "regedit" aus dem Startmenü zu starten. – Brian

0

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.

+0

Viel Glück beim Schreiben einer 64-Bit-Exe mit Delphi. ;) – Deltics

+0

Mach es gerade jetzt. (2015) – penarthur66

12
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; 
1

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).

0

// nicht getestet, aber u kann versuchen, diese

is64 := (Environment.GetEnvironmentVariable('ProgramW6432') <> ''); 
+0

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. :-) –

+0

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! –

0

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; 
0
function TForm2.Arch: string; 
begin 
if TOSVersion.Architecture=arIntelX86 then 
    Result := '32-bit' Else Result := '64-bit' 
end; 
+2

TOSVersion wurde auf XE2 eingeführt, die Frage betrifft Delphi 2007. – bummi