2010-03-26 5 views
7

¿Cómo puedo obtener información sobre el tipo de sistema operativo Windows? ¿Es de 32 bits o 64 bits? ¿Cómo puedo obtener esta información programáticamente?¿Cómo obtener información sobre la computadora? [32 bits o 64 bits]

+2

"compiuter"? "abaout"? "programa"? Tómese el tiempo para leer su pregunta antes de publicarla. –

+4

@Joachim Sauer: StackOverflow es un foro internacional y no se puede esperar inglés perfecto de todos, solo corrige los molestos errores de gramática. – kludg

+1

@Serg: imperfect English y typos simples son dos cosas diferentes. Estoy bastante seguro de que "abaout" es lo último. No tengo ningún problema con el inglés imperfecto (no soy un hablante nativo). –

Respuesta

6

Es necesario utilizar GetProcAddress() para comprobar la disponibilidad de la función IsWow64Process() en tiempo de ejecución, así:

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; 

porque esa función sólo está disponible en las versiones de Windows que tienen un sabor de 64 bits. Declararlo como external evitaría que su aplicación se ejecute en Windows 2000 o Windows XP pre SP2.

Editar:

Chris ha publicado un comentario sobre el almacenamiento en caché el resultado por razones de rendimiento. Esto puede no ser necesario para esta función API particular, porque kernel32.dll siempre estará allí (y no puedo imaginar un programa que incluso cargue sin él), pero para otras funciones las cosas pueden ser diferentes. Así que aquí está una versión que almacena el resultado de la función:

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; 

Almacenamiento en caché de este resultado de la función es segura, ya que la función de la API será ya sea allí o no, y su resultado no se puede cambiar en la misma instalación de Windows. Incluso es seguro llamar esto concurrentemente desde varios subprocesos, ya que dos subprocesos que encuentran WasCalled en False llamarán a la función, escribirán el mismo resultado en la misma ubicación de memoria y solo después establecerán WasCalled en True.

+0

Será una buena idea guardar en caché el resultado si el programa necesita saber la respuesta varias veces. es decir, no querrá llamar esto en un bucle, ya que LoadLibrary será costoso, particularmente cuando no encuentra nada. No estoy criticando la solución, solo dando consejos sobre el caso de uso. –

+2

Este código solo se compilará si las constantes asignables/grabables están habilitadas en la configuración del proyecto. Para evitar ser sensible a esta configuración del compilador, introduzca directivas para asegurar que el comportamiento del compilador se establezca (y restaure) según se requiera alrededor de este código, o mejor aún, sugeriría usar una variable unitaria para el resultado en caché (utilizando un entero evita necesidad de usar dos de estas variables: por ejemplo, declarar initialised = -1 para "not set", set = 0 para Win32 set = 1 para Win64). – Deltics

3

Si a) usted está en Windows yb) puede acceder al registro, entonces HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion debe ser informativo.

+0

Lo sentimos, pero no hay registro. Estoy usando Windows – gedO

+5

@gedO: Te estás contradiciendo. Windows significa registro. Intenta ejecutar "regedit" desde el menú de inicio. – Brian

0

No sé cómo llamar a la función Win32 en Delphi.

Pero si escribe un programa de 32 bits, puede llamar a la API de Win32 IsWow64Process para saber si se encuentra en un sistema operativo de 64 bits.

Por supuesto, si escribe un exe de 64 bits, solo se ejecutará en Windows de 64 bits, por lo que no es necesario que pregunte.

+0

Buena suerte escribiendo un exe de 64 bits con Delphi. ;) – Deltics

+0

Haciéndolo ahora. (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

Además de IsWow64Process, la función GetNativeSystemInfo API puede ser de interés para usted (se define en la unidad Windows) para obtener más información sobre la CPU que está en (o puede utilizar el montaje y CPUID).

0

// no probado, pero u puede probar este

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

Esta pregunta está etiquetada 'delphi', y no tiene ninguna mención de .net o Java. Por lo tanto, no puede suponer que 'Environment' está disponible. Lea las etiquetas antes de responder preguntas para asegurarse de que su respuesta se aplique a ellas. Si no está seguro, probablemente no debería contestar la pregunta. :-) –

+0

Un codificador Delphi llegaría allí, notando que debe tener un entorno de objetos definido, por lo tanto, simplemente lo eliminará: is64: = ({Environment.} GetEnvironmentVariable ('ProgramW6432') <> ''); ¡gracias! –

0

para XE delphi +

Uses System.SysUtils 

Function IsWin64Or32: string; 
Begin 
    if Pos('64-bit', TOSVersion.ToString) > 0 then 
    Result := '64-bit' 
    Else 
    Result := '32-bit'; 
End; 

Ejemplo

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

TOSVersion se introdujo en XE2, la pregunta es sobre Delphi 2007. – bummi

Cuestiones relacionadas