¿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]
Respuesta
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
.
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. –
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
Si a) usted está en Windows yb) puede acceder al registro, entonces HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion debe ser informativo.
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.
Buena suerte escribiendo un exe de 64 bits con Delphi. ;) – Deltics
Haciéndolo ahora. (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;
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
).
// no probado, pero u puede probar este
is64 := (Environment.GetEnvironmentVariable('ProgramW6432') <> '');
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. :-) –
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! –
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;
function TForm2.Arch: string;
begin
if TOSVersion.Architecture=arIntelX86 then
Result := '32-bit' Else Result := '64-bit'
end;
TOSVersion se introdujo en XE2, la pregunta es sobre Delphi 2007. – bummi
- 1. 64 bits por división de 32 bits
- 2. ¿iPhone OS es de 64 bits o 32 bits?
- 3. ¿Aplicación de 32 bits o de 64 bits en el sistema operativo de 64 bits?
- 4. QtCreator en Linux: 32 bits frente a 64 bits
- 5. Mezcla de 32 bits y 64 bits P/Invoca
- 6. Eclipse 32 bits ejecutándose en 64 bits JVM
- 7. tamaño de la máquina 64 o 32 bits
- 8. uint es de 32 bits, sin importar si el sistema es de 32 o 64 bits?
- 9. Java JDK 32 bits frente a 64 bits
- 10. Determinación de Windows de 64 bits frente a 32 bits
- 11. Compilación de 32 bits con llvm-gcc de 64 bits
- 12. Agregar números de 64 bits con aritmética de 32 bits
- 13. Compatibilidad con Java de 32 bits frente a 64 bits
- 14. MapViewOfFile compartido entre procesos de 32 bits y 64 bits
- 15. Wendy ASP.NET AJAX Error/32 bits a 64 bits
- 16. ¿Cómo determinar la arquitectura de construcción (32 bits/64 bits) con hormiga?
- 17. conversión de aplicación .NET 32 bits a 64 bits
- 18. Objeto compartido/bibliotecas mixtas de 32 bits y 64 bits
- 19. Registros de 64 bits en ventanas de 32 bits
- 20. Ejecute AnyCPU como 32 bits en sistemas de 64 bits
- 21. Puerto 32 bits Controlador de Windows a 64 bits Windows
- 22. 64 bits ODBC Excepción
- 23. ¿Cómo puedo verificar si un binario compilado es de 32 bits o de 64 bits?
- 24. Cómo comprobar si IIS está en el modo de 32 bits o de 64 bits
- 25. Programar determinar si native .exe es de 32 bits o de 64 bits
- 26. Elegante y segura manera de determinar si la arquitectura es de 32 bits o 64 bits
- 27. Usando C#, ¿cómo saber si mi máquina es de 64 bits o 32 bits?
- 28. Windows 7 64 bits incorrecta PATH al cargar la biblioteca de 32 bits para 32 bits exe
- 29. ¿Cómo fuerzo Python para ser de 32 bits en Snow Leopard y otras preguntas de 32 bits/64 bits
- 30. División de 64/32 bits en un procesador con división de 32/16 bits
"compiuter"? "abaout"? "programa"? Tómese el tiempo para leer su pregunta antes de publicarla. –
@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
@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). –