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
- 1. System.Diagnostics.Process dosyasının 32 veya 64 bit olup olmadığı nasıl belirlenir?
- 2. Platformuna bağlı olarak x64 veya x86 DLL dosyasını yükleyin?
- 3. Bir .NET Derlemesinin x86, x64 veya Herhangi Bir CPU Olarak Derlenmiş Olması Nasıl Anlaşılır
- 4. Hangi VC++ yeniden dağıtılabilir paketi (x86 veya x64) seçmek için?
- 5. Nasıl 32 bit C# uygulaması bir 64 bit DLL kullanabiliyor
- 6. x64'ten x86 COM erişimi x64 .NET
- 7. x86 vs x64 paketleri nasıl kullanılır
- 8. Yönetilen bir derlemenin x86, x64 veya AnyCPU olup olmadığı program aracılığıyla nasıl denetlenir?
- 9. Bir x64 uygulaması x86 montajlarını kullanabilir mi?
- 10. Lazarus/freepascal
- 11. 64 bit sistemde 32 bit dll kullanma 0x8007000B Hatası
- 12. Delphi ve Lazarus arasındaki Form Başlatmadaki Farklar?
- 13. WOW64: x64% CommonProgramFiles% 32 bit işlemden olsun
- 14. System.IO.File.Exists() x86 ve x64 uygulamalarından farklı yanıt
- 15. Bildirilen işlevi denetlenemedi veya değil .dll dosyasında
- 16. Hem x86 hem de x64 için derleme
- 17. Modül makine türü 'X86' nasıl giderilir? 'X64' Visual Studio
- 18. x86 128 bit atomik işlemler
- 19. NuGet paketine x86 ve x64 kitaplıkları ekleme
- 20. Düzenleme .doc veya .docx dosyası kullanılarak php
- 21. Çağrı Delphi DLL
- 22. bina x64 C# projesi 32 bit hedeflerle msbuild sonuçları
- 23. Visual Studio proje dosyasının uygulama, DLL veya statik kitaplık projesini temsil ettiğini nasıl anlarsınız?
- 24. 12 bit int 16 veya 32 bit dönüştür
- 25. Nasıl pyinstaller MSVC? 90.dll dosyasının doğru sürümlerini gösterir?
- 26. x64 pencerelerinde PartCover'ı nasıl çalıştırırım
- 27. C# COM DLL: Regasm veya Regsvr32 kullanıyor musunuz?
- 28. DLL neden bir PCL projesinden x86 derlemesidir?
- 29. GCC veya Cygwin'de bir DLL oluşturma?
- 30. x86 üzerinde x64 kullanmak için ASP.NET'i yapılandırın Windows
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