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
- 1. SQL Server 2012 a 32 bit o 64 bit su computer a 64 bit?
- 2. iPhone OS 64 bit o 32 bit?
- 3. Compatibilità Java 32-bit vs 64-bit
- 4. 64 bit per divisione 32 bit
- 5. Devo usare Python 32 bit o Python 64 bit
- 6. dimensioni della macchina 64 o 32 bit
- 7. Attributo struct differente basato su 32 bit o 64 bit
- 8. Come ottenere il percorso assoluto del file dipende Windows a 32-bit o 64-bit macchina
- 9. Come installo condizionatamente un file con WiX basato sul computer di destinazione (32 bit o 64 bit)?
- 10. Come posso ottenere libpam.so.0 (32 bit) sul mio RHEL6 a 64 bit?
- 11. Come utilizzare virtualenv in Python a 32 bit su un computer a 64 bit?
- 12. Come verificare il kernel 32-bit/64-bit per Linux
- 13. C'è un modo per verificare se il processo è a 64 bit o a 32 bit?
- 14. Come si esegue un VBScript in modalità a 32 bit su un computer a 64 bit?
- 15. Come scrivere codice convertibile, 32 bit/64 bit?
- 16. Esegui AnyCPU come 32-bit su sistemi 64-bit
- 17. Intellij idea 32 bit vs 64 bit velocità e prestazioni
- 18. QtCreator su linux: 32 bit contro 64 bit
- 19. Come compilare un programma C++ come 64-bit su un computer a 64 bit?
- 20. utilizzando com libreria 32 bit su 64 bit delle applicazioni
- 21. Esiste un modo per eseguire programmi a 64 bit su un computer a 32 bit?
- 22. Interop da 64 a 32 bit - come?
- 23. Come ottenere la directory "programmi" a 64 bit nell'applicazione a 32 bit
- 24. Eseguire client Oracle in modalità a 32 bit su un computer a 64 bit
- 25. Esegui libreria a 32 bit su iPhone 5s 64 bit
- 26. Perché MSBuild a 64 bit carica estensioni a 32 bit?
- 27. Dimensioni delle strutture su 32 bit e 64 bit
- 28. SDK Android a 32 o 64 bit su sistema operativo Windows a 64 bit?
- 29. Compilando 32 bit Assembler su ubuntu a 64 bit
- 30. .net Utilità InstallUtil - 32 bit vs 64 bit
"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). –