Usando Delphi 2007+ o Lazarus (Win64) Estoy buscando una forma de determinar si un dll está compilado como x64 o x86.Cómo determinar si el archivo dll fue compilado como un bit x64 o x86 usando Delphi o Lazarus
Respuesta
Debe leer y analizar el encabezado PE.
De esta manera:
function Isx64(const Strm: TStream): Boolean;
const
IMAGE_FILE_MACHINE_I386 = $014c; // Intel x86
IMAGE_FILE_MACHINE_IA64 = $0200; // Intel Itanium Processor Family (IPF)
IMAGE_FILE_MACHINE_AMD64 = $8664; // x64 (AMD64 or EM64T)
// You'll unlikely encounter the things below:
IMAGE_FILE_MACHINE_R3000_BE = $160; // MIPS big-endian
IMAGE_FILE_MACHINE_R3000 = $162; // MIPS little-endian, 0x160 big-endian
IMAGE_FILE_MACHINE_R4000 = $166; // MIPS little-endian
IMAGE_FILE_MACHINE_R10000 = $168; // MIPS little-endian
IMAGE_FILE_MACHINE_ALPHA = $184; // Alpha_AXP }
IMAGE_FILE_MACHINE_POWERPC = $1F0; // IBM PowerPC Little-Endian
var
Header: TImageDosHeader;
ImageNtHeaders: TImageNtHeaders;
begin
Strm.ReadBuffer(Header, SizeOf(Header));
if (Header.e_magic <> IMAGE_DOS_SIGNATURE) or
(Header._lfanew = 0) then
raise Exception.Create('Invalid executable');
Strm.Position := Header._lfanew;
Strm.ReadBuffer(ImageNtHeaders, SizeOf(ImageNtHeaders));
if ImageNtHeaders.Signature <> IMAGE_NT_SIGNATURE then
raise Exception.Create('Invalid executable');
Result := ImageNtHeaders.FileHeader.Machine <> IMAGE_FILE_MACHINE_I386;
end;
Gracias por la respuesta. Desafortunadamente, esto requeriría que JCL funcione. No he agregado JCL a mi Delphi 2007, pero podría hacerlo si parece ser la única solución conveniente. – TheSteven
¿Qué? Este código no usa ninguna clase JCL ni rutinas. – Alex
Su versión actualizada funciona perfectamente en Delphi 2007 y Delphi 2010. Una solución elegante, gracias. – TheSteven
usted podría utilizar JclPeImage del JCL. La siguiente aplicación muestra cómo hacerlo.
program Isx64ImageTest;
{$APPTYPE CONSOLE}
uses
SysUtils, JclWin32, JclPEImage;
var
PEImage: TJclPeImage;
begin
PEImage := TJclPeImage.Create;
try
//usage is "Isx64ImageTest filename"
PEImage.FileName := ParamStr(1);
//print the machine value as string
WriteLn(Format('Machine value of image %s is %s',
[PEImage.FileName, PEImage.HeaderValues[JclPeHeader_Machine]]));
//check for a special machine value
case PEImage.LoadedImage.FileHeader^.FileHeader.Machine of
IMAGE_FILE_MACHINE_I386: begin end;
IMAGE_FILE_MACHINE_AMD64: begin end;
else
begin
end;
end;
finally
PEImage.Free;
end;
end.
Si está utilizando JCL - hay un enfoque más simple - usando la función PeMapImgTarget o la propiedad PEImage.Target (en su ejemplo). No es necesario que analices los encabezados por ti mismo. – Alex
Aún no usa JCL, puede hacerlo eventualmente. He estado intentando duplicar mis componentes Delphi2007 y Delphi2010 porque he estado planeando migrar a Delphi2010. ¿Está JCL disponible para Delphi2010? – TheSteven
JCL está disponible para D2010. – Alex
- 1. Visual Studio cargando el dll derecho (x86 o x64)!
- 2. ¿Cómo determinar si se construyó un ensamblado .NET para x86 o x64?
- 3. Cómo saber si un ensamblado .NET se compiló como x86, x64 o cualquier CPU
- 4. Usando x64 dll en la aplicación x86
- 5. Cargando ensamble x86 o x64
- 6. ¿Por qué un .NET EXE, compilado como x86, se ejecuta como x64?
- 7. ¿Cómo verificar programáticamente si un ensamblado administrado es x86, x64 o AnyCPU?
- 8. Determinar si un archivo ejecutable (o biblioteca) es 32 o 64 bit
- 9. ¿Cómo puedo saber si estoy en x64 o x86 usando .NET?
- 10. Convertir 32 bit dll a 64 bit dll
- 11. Cómo determinar si DLL es COM o .NET?
- 12. Escribiendo ensamble x86 en un procesador x64 bit
- 13. Cómo determinar si un archivo DLL requiere Full .NET 4 o solo Client Profile
- 14. Cómo verificar si un archivo ejecutable o una DLL se compila en modo Liberar o Depurar (C++)
- 15. Ejecutar MSI x86 o x64 desde MSBuild bootstrapper
- 16. Configuración orientada tanto a x86 como a x64?
- 17. Compilación para x86 y x64
- 18. Delphi & Lazarus ambos instalados
- 19. cómo saber qué CPU usar en compilación (x86 x64 o AnyCpu)?
- 20. ¿Cómo verificar si un EditText fue cambiado o no?
- 21. ¿Cómo puedo determinar mediante programación si un archivo MP3 es CBR o VBR? (Preferiblemente usando C#)
- 22. Cómo determinar si una ruta de directorio fue SUBST'd
- 23. Comprobando si un número es positivo o negativo usando operadores bit a bit
- 24. ¿Puedo instalar Windbg x86/x64 en mi x64 WIN7?
- 25. Cómo depurar un archivo DLL en Delphi
- 26. ¿Resolver una dependencia de Maven de forma diferente si la JVM en uso es x86 o x64?
- 27. Determinar si un archivo ejecutable (o biblioteca) es de 32 o 64 bits (en Windows)
- 28. ADO o DBX usando Delphi
- 29. ¿Cuál sería la mejor solución para mis aplicaciones Delphi en Linux - Delphi + Wine o Lazarus?
- 30. Diferencias de TVarData entre x86 y x64 Delphi
He encontrado las siguientes preguntas, pero no he tenido tiempo para asimilarlo: http://www.tech-archive.net/Archive/Development/microsoft.public.win32.programmer.tools/ 2006-12/msg00011.html Este enlace: http://www.delphidabbler.com/articles?article=8&part=2 mencionado en el artículo vinculado anterior proporciona fuente Delphi para analizar el encabezado del archivo que puede identificar 16 y 32 bit, pero no 64. El código puede ejecutarse en Delphi 2007 tal como está pero no en Delphi2010 o Lazarus, al menos no sin más modificaciones de las que tuve tiempo o experiencia. – TheSteven