2010-05-01 11 views
6

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

+0

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

cevap

14

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; 
+0

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

+0

Ne? Bu kod herhangi bir JCL sınıfını ve rutinini kullanmaz. – Alex

+1

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

4

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. 
+1

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

+0

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

+0

JCL, D2010 için kullanılabilir. – Alex