Delphi 2007+ veya Lazarus (Win64) kullanarak bir dll x64 veya x86 olarak derlenmiş olup olmadığını belirlemek için bir yol mu arıyorsunuz?dll dosyasının Delphi veya Lazarus kullanılarak x64 veya x86 bit olarak derlenip derlenmediği nasıl belirlenir
cevap
PE başlığını okumalı ve ayrıştırmalısınız. Bunun gibi
:
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;
Yanıt için teşekkürler. Ne yazık ki bu JCL'nin çalışmasını gerektirecekti. Ben Delphi 2007'ye JCL eklemedim ama tek uygun çözüm gibi görünüyorsa olabilir. – TheSteven
Ne? Bu kod herhangi bir JCL sınıfını ve rutinini kullanmaz. – Alex
Güncel sürümünüz Delphi 2007 ve Delphi 2010'da gayet güzel çalışıyor. Zarif bir çözüm - teşekkürler. – TheSteven
Sen JCL dan JclPeImage kullanabilirsiniz. Aşağıdaki uygulama nasıl yapılacağını gösterir.
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.
JCL kullanıyorsanız - daha basit bir yaklaşım var - PeMapImgTarget işlevini veya PEImage.Target özelliğini kullanarak (örneğinizde). Başlıkları kendiniz analiz etmeye gerek yok. – Alex
Henüz JCL kullanmıyorsanız, sonunda bunu yapabilir. Delphi2007 ve Delphi2010 bileşenlerini yansıtmaya çalışıyorum çünkü Delphi2010'a geçiş yapmayı planlıyorum. JCL Delphi2010 için kullanılabilir mi? – TheSteven
JCL, D2010 için kullanılabilir. – Alex
Ben şu bilgileri buldum ama onu asimile etmeye zamanım olmadı: http://www.tech-archive.net/Archive/Development/microsoft.public.win32.programmer.tools/ 2006-12/msg00011.html Bu bağlantı: http://www.delphidabbler.com/articles?article=8&part=2 önceki bağlantıda geçen makalede, 16 & # 39; i tanımlayabilen dosya üstbilgisini ayrıştırmak için Delphi kaynağı sağlar. 32 bit, ancak 64 değil. Kod, Delphi 2007'de olduğu gibi Delphi2010 veya Lazarus'ta da çalışabilir - en azından zamanım veya tecrübemden daha fazla değişiklik yapmadan olmaz. – TheSteven