2010-03-26 22 views
7

Come posso ottenere informazioni sul tipo di sistema operativo Windows? È a 32 bit o 64 bit? Come posso ottenere queste informazioni in modo programmatico?Come ottenere informazioni sul computer? [32 bit o 64 bit]

+2

"compiuter"? "Abaout"? "Programory"? Per favore, prenditi il ​​tempo di leggere la tua domanda prima di pubblicarle. –

+4

@Joachim Sauer: StackOverflow è un forum internazionale e non ci si può aspettare un inglese perfetto da tutti, basta correggere gli errori di grammatica fastidiosi. – kludg

+1

@Serg: l'inglese imperfetto e gli errori di battitura semplici sono due cose diverse. Sono abbastanza sicuro che "abaout" è il secondo. Non ho alcun problema con l'inglese imperfetto (io non sono un madrelingua anch'io). –

risposta

6

è necessario utilizzare GetProcAddress() per verificare la disponibilità della funzione IsWow64Process() in fase di esecuzione, in questo modo:

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; 

perché questa funzione è disponibile solo sulle versioni di Windows che hanno un sapore a 64 bit. Dichiarandolo come external si impedisce l'esecuzione dell'applicazione su Windows 2000 o Windows XP pre SP2.

Edit:

Chris ha pubblicato un commento sulla memorizzazione nella cache il risultato per motivi di prestazioni. Questo potrebbe non essere necessario per questa particolare funzione API, perché kernel32.dll sarà sempre lì (e non riesco a immaginare un programma che potrebbe caricare anche senza di esso), ma per altre funzioni le cose potrebbero essere diverse. Quindi, ecco una versione che memorizza nella cache il risultato della funzione:

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; 

Caching questo risultato funzione è sicuro, in quanto la funzione API o sarà lì o no, e il suo risultato non può cambiare sulla stessa installazione di Windows. È anche sicuro chiamarlo contemporaneamente da più thread, poiché due thread che trovano WasCalled da False chiameranno entrambi la funzione, scrivono lo stesso risultato nella stessa posizione di memoria e solo dopo impostano WasCalled in True.

+0

Sarebbe una buona idea memorizzare nella cache il risultato se il programma ha bisogno di conoscere la risposta più volte. Ad esempio, non si vorrebbe chiamare questo in un ciclo, in quanto LoadLibrary sarà costoso, in particolare quando non trova nulla. Non sto battendo la soluzione, solo dando consigli sul caso d'uso. –

+2

Questo codice verrà compilato solo se le costanti assegnabili/scrivibili sono abilitate nelle impostazioni del progetto. Per evitare di essere sensibili a questa impostazione del compilatore, introdurre le direttive per garantire che questo comportamento del compilatore sia impostato (e ripristinato) come richiesto attorno a questo codice, o meglio ancora, suggerirei di usare una variabile unitaria per il risultato memorizzato nella cache (usando un intero evita avendo bisogno di usare due di queste variabili: ad es. dichiarare inizializzato = -1 per "non impostato", set = 0 per Win32 set = 1 per Win64). – Deltics

3

Se a) si è su windows eb) è possibile accedere al registro quindi HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion dovrebbe essere informativo.

+0

Siamo spiacenti, ma nessun registro. Sto usando windows – gedO

+5

@gedO: Stai contraddicendo te stesso. Windows significa registro. Prova a eseguire "regedit" dal menu di avvio. – Brian

0

Non so come chiamare la funzione Win32 in Delphi.

Ma se si scrive un programma a 32 bit, è possibile chiamare l'API Win32 IsWow64Process per sapere se ci si trova in un sistema operativo a 64 bit.

Ovviamente, se si scrive un exe a 64 bit, verrà eseguito solo su Windows a 64 bit, quindi non è necessario chiedere.

+0

Buona fortuna a scrivere un exe a 64 bit con Delphi. ;) – Deltics

+0

Fallo ora. (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

Oltre a IsWow64Process, la funzione GetNativeSystemInfo API possono essere di interesse per voi (è definito nell'unità Windows) per scoprire di più sulla CPU si è in (oppure si può utilizzare il montaggio e CPUID).

0

// non testati, ma u può provare questo

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

Questa domanda è contrassegnata da 'delphi', e non ha alcuna menzione di .net o Java. Pertanto, non puoi assumere che 'Environment' sia disponibile. Si prega di leggere i tag prima di rispondere alle domande per assicurarsi che la risposta si applica a loro. Se non sei sicuro, probabilmente non dovresti rispondere alla domanda. :-) –

+0

Un programmatore Delphi arriverebbe lì, notando che deve avere un Object Environment definito, quindi lo rimuoverà: is64: = ({Environment.} GetEnvironmentVariable ('ProgramW6432') <> ''); grazie! –

0

per 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; 

Esempio

lbl1.Caption := IsWin64Or32; 
0
function TForm2.Arch: string; 
begin 
if TOSVersion.Architecture=arIntelX86 then 
    Result := '32-bit' Else Result := '64-bit' 
end; 
+2

TOSVersion è stato introdotto su XE2, la domanda riguarda Delphi 2007. – bummi

Problemi correlati