2010-05-01 2 views
6

Delphi 2007+ 또는 Lazarus (Win64)를 사용하여 dll이 x64 또는 x86으로 컴파일되었는지 확인하는 방법을 찾고 있습니까?dll 파일이 Delphi 또는 Lazarus를 사용하여 x64 또는 x86 비트로 컴파일되었는지 확인하는 방법

+0

나는 다음과 같은 정보를 발견했습니다하지만 동화 할 시간이 없었어요 : http://www.tech-archive.net/Archive/Development/microsoft.public.win32.programmer.tools/ 2006-12/msg00011.html 이 링크 : http://www.delphidabbler.com/articles?article=8&part=2 이전 링크 된 기사에서 언급 한 은 델파이 소스를 제공하여 16 & 32 비트이지만 64는 아닙니다.이 코드는 델파이 2007에서 실행될 수 있지만 델파이 2010이나 라자루스에서는 실행되지 않습니다. – TheSteven

답변

14

PE 헤더를 읽고 구문 분석해야합니다. 이처럼

:

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

응답 해 주셔서 감사합니다. 아쉽게도 JCL이 작동해야합니다. 필자는 Delphi 2007에 JCL을 추가하지 않았지만 단지 편리한 솔루션 인 것처럼 보일 수 있습니다. – TheSteven

+0

무엇? 이 코드는 JCL 클래스 나 루틴을 사용하지 않습니다. – Alex

+1

업데이트 된 버전은 Delphi 2007 및 Delphi 2010에서 잘 작동합니다. 우아한 해결책 - 고마워요. – TheSteven

4

당신은 JCL에서 JclPeImage를 사용할 수 있습니다. 다음 앱에서는이를 수행하는 방법을 보여줍니다.


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을 사용한다면 PeMapImgTarget 함수 나 PEImage.Target 속성을 사용하는 것이 더 간단한 접근법이다. 혼자서 헤더를 분석 할 필요가 없습니다. – Alex

+0

아직 JCL을 사용하지 않으므로 결국 그렇게 할 수 있습니다. 저는 Delphi2010으로 마이그레이션 할 계획 이었기 때문에 Delphi2007 및 Delphi2010 구성 요소를 미러링하려고했습니다. Delphi2010에서 JCL을 사용할 수 있습니까? – TheSteven

+0

JCL은 D2010에서 사용할 수 있습니다. – Alex

관련 문제