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]
risposta
è 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
.
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. –
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
Se a) si è su windows eb) è possibile accedere al registro quindi HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion dovrebbe essere informativo.
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.
Buona fortuna a scrivere un exe a 64 bit con Delphi. ;) – Deltics
Fallo ora. (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;
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
).
// non testati, ma u può provare questo
is64 := (Environment.GetEnvironmentVariable('ProgramW6432') <> '');
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. :-) –
Un programmatore Delphi arriverebbe lì, notando che deve avere un Object Environment definito, quindi lo rimuoverà: is64: = ({Environment.} GetEnvironmentVariable ('ProgramW6432') <> ''); grazie! –
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;
function TForm2.Arch: string;
begin
if TOSVersion.Architecture=arIntelX86 then
Result := '32-bit' Else Result := '64-bit'
end;
TOSVersion è stato introdotto su XE2, la domanda riguarda Delphi 2007. – bummi
"compiuter"? "Abaout"? "Programory"? Per favore, prenditi il tempo di leggere la tua domanda prima di pubblicarle. –
@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
@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). –