2010-05-01 9 views
6

का उपयोग कर के रूप में उपयोग संकलित किया गया था या तो डेल्फी 2007+ या लाजर (Win64) मैं निर्धारित करने के लिए एक dll 64 या 86 के रूप में संकलित किया गया है एक तरह से तलाश कर रहा हूँ?कैसे निर्धारित करें कि dll फ़ाइल 64 या 86 बिट या तो डेल्फी या लाजर

+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

आप पढ़ सकते हैं और पीई हैडर पार्स चाहिए।

इस तरह

:

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

प्रतिक्रिया के लिए धन्यवाद। दुर्भाग्य से जेसीएल को काम करने की आवश्यकता होगी। मैंने अपने डेल्फी 2007 में जेसीएल नहीं जोड़ा है, लेकिन अगर यह एकमात्र लाभकारी समाधान की तरह दिखता है। – TheSteven

+0

क्या? यह कोड किसी भी जेसीएल कक्षाओं और न ही दिनचर्या का उपयोग नहीं करता है। – Alex

+1

आपका अपडेट किया गया संस्करण डेल्फी 2007 और डेल्फी 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

यदि आप जेसीएल का उपयोग कर रहे हैं - PeMapImgTarget फ़ंक्शन या PEImage.Target property (आपके उदाहरण में) का उपयोग करके - अधिक सरल दृष्टिकोण है। अपने आप से हेडर का विश्लेषण करने की आवश्यकता नहीं है। – Alex

+0

अभी तक जेसीएल का उपयोग नहीं कर रहा है, अंततः ऐसा कर सकता है। मैं अपने डेल्फी2007 और डेल्फी -2010 घटकों को दर्पण करने की कोशिश कर रहा हूं क्योंकि मैं डेल्फी -2010 में माइग्रेट करने की योजना बना रहा हूं। क्या जेसीएल डेल्फी -2010 के लिए उपलब्ध है? – TheSteven

+0

जेसीएल डी 2010 के लिए उपलब्ध है। – Alex

संबंधित मुद्दे