AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

DLL prüfen

Ein Thema von Delbor · begonnen am 3. Apr 2019 · letzter Beitrag vom 4. Apr 2019
Antwort Antwort
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.186 Beiträge
 
Delphi 11 Alexandria
 
#1

DLL prüfen

  Alt 3. Apr 2019, 11:49
Delphi-Version: 5
Hi zusammen

Gibt es eine Möglichkeit, nicht nur die Dateiversion, sondern auch die Plattform (Win32, Win 64) einer DLL zu prüfen?

Gruss
Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#2

AW: DLL prüfen

  Alt 3. Apr 2019, 11:53
Vielleicht funktioniert das ja. Braucht aber JCL.

Delphi-Quellcode:
// Source:
// https://stackoverflow.com/questions/2748474/how-to-determine-if-dll-file-was-compiled-as-x64-or-x86-bit-using-either-delphi

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;
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.186 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: DLL prüfen

  Alt 3. Apr 2019, 12:01
Hi DieDolly

Danke für deine prompte Antwort!!!
Das das so schnell geht, hätte ich mir jetzt echt nie träumen lassen!

Gruss
Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#4

AW: DLL prüfen

  Alt 3. Apr 2019, 12:50
Kann man die Funktion eventuell auch so verwenden?

Delphi-Quellcode:
 function Isx64(const FileName: string): 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;
  MemoryStream: TMemoryStream;
 begin
  MemoryStream := TMemoryStream.Create;
  try
   MemoryStream.LoadFromFile(FileName);

   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');
  finally
   MemoryStream.Free;
  end;

  Result := ImageNtHeaders.FileHeader.Machine <> IMAGE_FILE_MACHINE_I386;
 end;
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.186 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: DLL prüfen

  Alt 3. Apr 2019, 14:22
Hi DieDolly

Mit kleinen Änderungen wohl schon. Du hast teilweise vegessen, die Zuweisung an den übergebenen Stream 'Strm' durch Memorystream zu ersetzen.
Delphi-Quellcode:
 begin
  MemoryStream := TMemoryStream.Create;
  try
   MemoryStream.LoadFromFile(FileName);

   Strm.ReadBuffer(Header, SizeOf(Header));// Das hier müsste heissen:
   MemoryStream.ReadBuffer(Header, SizeOf(Header));
   if (Header.e_magic <> IMAGE_DOS_SIGNATURE) or (Header._lfanew = 0) then
    raise Exception.Create('Invalid executable');
   MemoryStream .Position := Header._lfanew;

   MemoryStream.ReadBuffer(ImageNtHeaders, SizeOf(ImageNtHeaders));
   if ImageNtHeaders.Signature <> IMAGE_NT_SIGNATURE then
    raise Exception.Create('Invalid executable');
  finally
   MemoryStream.Free;
  end;
Gruss
Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#6

AW: DLL prüfen

  Alt 3. Apr 2019, 14:25
Ups. Richtig. Stream hinzugefügt aber den alten nicht gelöscht

Hier nochmal alles richtig mit überladenen Prozeduren

Delphi-Quellcode:
function Isx64(const Strm: TStream): Boolean; overload;
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;

function Isx64(const FileName: string): Boolean; overload;
var
 MemoryStream: TMemoryStream;
begin
 MemoryStream := TMemoryStream.Create;
 try
  MemoryStream.LoadFromFile(FileName);
  Result := Isx64(MemoryStream);
 finally
  MemoryStream.Free;
 end;
end;

Geändert von DieDolly ( 3. Apr 2019 um 14:27 Uhr)
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.186 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: DLL prüfen

  Alt 3. Apr 2019, 16:21
Hi DieDolly

Nochmals vielen Dank!

Gruss
Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
Andreas L.

Registriert seit: 23. Mai 2011
Ort: Furth im Wald
308 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: DLL prüfen

  Alt 4. Apr 2019, 09:59
Delphi-Quellcode:
function Isx64(const Strm: TStream): Boolean; overload;
begin
  // Original Funktion
end;

function Isx64(AFileName: String): Boolean; overload;
var
  FileStream: TFileStream;
begin
  Result := False;
  if not SysUtils.FileExists(AFileName) then
    Exit;

  FileStream := TFileStream.Create(AFileName, fmOpenRead);
  try
    Result := Isx64(FileStream);
  finally
    FreeAndNil(FileStream);
  end;
end;
Das overload ist wichtig wenn die Namen der Routinen gleich sein sollen.
Andreas Lauß
Blog
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:01 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz