Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi DLL bei 64Bit-System wird nicht geladen (https://www.delphipraxis.net/179698-dll-bei-64bit-system-wird-nicht-geladen.html)

khm8 25. Mär 2014 13:16

Delphi-Version: 7

DLL bei 64Bit-System wird nicht geladen
 
Hallo,
ich habe leider nicht viel Ahnung vom Programmieren, darf aber ein Programm von einem Kollegen übernehmen und soll es für Windows 7 64Bit umschreiben.
Kurz zur Umgebung:
Delphi 7 auf einer VMWare mit WIN7 64Bit

Hier mal ein Code-Auszug:
Code:
function LoadIK220DLL(DLLName:String):Bool32;
var
err:Boolean;

begin
try
DLLName := PAnsiChar(ExtractFilePath(Application.ExeName)+DLLName);
if FileExists(DLLName) then
begin
ShowMessage('Mich gibt es');
ShowMessage(DLLName);
SetLastError(0);
DLLHandle := LoadLibrary(Pchar(DLLName));
if DLLHandle = 0 then
ShowMessage(SysErrorMessage(GetLastError));
end else
begin
ShowMessage('Datei IK220DLL64.dll gibt es nicht!');
DLLHandle := 0;
exit;
end;
An dem Programm wurde sonst nichts geändert. Es soll halt jetzt nur statt der 32Bit-DLL die 64Bit-DLL geladen werden.
Aber der DLLHandle gibt immer 0 zurück und die mir nichts sagende Fehlermeldung ist:

"%1 ist keine zulässige Win32-Anwendung"

Die gleiche Meldung kommt übrigens auch, wenn ich das Programm unter XP laufen lassen will und die 64Bit-DLL geladen werden soll.
Nehme ich die alte 32Bit-DLL geht es (auch bei Win7).

Hat jemand eine Idee, woran das liegen kann?

Vielen Dank schon einmal für eure Hilfe.

Neutral General 25. Mär 2014 13:19

AW: DLL bei 64Bit-System wird nicht geladen
 
Hallo,

Du kannst mit einem 32-Bit Programm keine 64-Bit DLLs laden.
Dafür brauchst du ein 64-Bit Programm. Aber das kannst du mit Delphi 7 nicht erzeugen.

khm8 25. Mär 2014 13:42

AW: DLL bei 64Bit-System wird nicht geladen
 
Vielen Dank für die schnelle Antwort :thumb:

khm8 25. Mär 2014 13:54

AW: DLL bei 64Bit-System wird nicht geladen
 
Typischer Anfängerfehler = > Crosspost!

Hab die Frage hier auch noch gestellt:

http://forum.delphi-treff.de/index.p...431#post439431

himitsu 25. Mär 2014 14:44

AW: DLL bei 64Bit-System wird nicht geladen
 
Was macht eigentlich das PAnsiChar da in dem Code?
String => PChar
AnsiString => PAnsiChar

Muß die DLL "zwingend" us dem Programmverzeichnis geladen werden?
Wenn nein, dann kann der Pfad weggelassen werden. LoadLibrary sucht sich die DLL schon von allein. Angefangen beim Programmpfad, bis zu den System-Verzeichnissen.

Delphi-Quellcode:
function LoadIK220DLL(DLLName: String): Bool32;
var
  err: Boolean; // wird das noch verwendet? (aber es fehlt ja eh der halbe Code)
begin
  try
    if FileExists(DLLName) then
    begin
      ShowMessage('Mich gibt es: ' + DLLName);
      DLLHandle := LoadLibrary(PChar(DLLName));
      if DLLHandle = 0 then
        RaiseLastOSError; // alt = RaiseLastWin32Error;
    end else
    begin
      //ShowMessage('Datei IK220DLL64.dll gibt es nicht!'); // Und wenn via DLLName ein anderer Dateiname übergeben wurde?
      ShowMessage('Datei ' + DLLName + ' gibt es nicht!');
      DLLHandle := 0;
      Exit; // Schau mal bitte in die Compilermeldung und beheben die aufgezählten Fehlermeldungen (vorallem bezüglich Result sei nicht initialisiert)
    end;
  ...
  • Und, wie bereits genannt, erstellt Delphi 7 ausschließlich Win32-Programme.
  • Win32-Programme können nur Win32-DLLs laden.
  • Aber ein Win32-Programm kann auch in einem Win64 ausgeführt werden. (dort genauer im WoW64 "Windows-on-Windows", welches das 32-Bit-Subsystem vom 64-Bit-Windows ist)
  • Wenn unbedingt eine 64-Bit-DLL nötig ist, z.B. weil die 32-Bit-DLL im Windows 64 den Treiber nicht ansprechen kann,
    dann muß dafür auch ein Win64-Programm erstellt werden. (neues Delphi mit Win64-Unterstützung oder Alternativen ala Lazarus)

Bernhard Geyer 25. Mär 2014 15:50

AW: DLL bei 64Bit-System wird nicht geladen
 
Zitat:

Zitat von himitsu (Beitrag 1253440)
Muß die DLL "zwingend" us dem Programmverzeichnis geladen werden?
Wenn nein, dann kann der Pfad weggelassen werden. LoadLibrary sucht sich die DLL schon von allein. Angefangen beim Programmpfad, bis zu den System-Verzeichnissen.

Ich würde keinesfalls den Pfad weg lassen! Genau diese "such doch mal überall ob du eine DLL mit dem Namen findest" ist doch ein Problemquelle die man nur schwer findet. Vor allem da MS denkt mit jeder Windows-Version die Logik der Suche zu ändern und diese fehlenden Pfadangaben schon für Sicherheitslücken (http://www.heise.de/newsticker/meldu...r-1204286.html) gesorgt haben.

himitsu 25. Mär 2014 16:11

AW: DLL bei 64Bit-System wird nicht geladen
 
Wobei es bisher immer so war, daß zuerst im Programmpfad gesucht wird.

Was sich in letzter Zeit verändert hat, ist, daß System-DLLs (k.A. wie diese spezifiziert sind) nicht mehr in den Programm- und Suchpfaden gesucht werden.
Womit "böse" Hooks/Trojaner/Viren/usw nicht einfach diese DLLs/Funktionen austauschen können, indem sie irgendwo eine gleichnamige DLL ablegen.

Via SxS müsste man aber dennoch regeln können, welche DLL-Version verwendet werden soll, wenn man Windows die Suche überlässt.




Wie leicht ist es eigentlich einen manipulierten Netzwerkpfad zu erstellen?

khm8 27. Mär 2014 15:31

AW: DLL bei 64Bit-System wird nicht geladen
 
Liste der Anhänge anzeigen (Anzahl: 1)
So, habe mir Delphi XE5 als 30 Tage-Testversion runtergeladen und installiert.

Hab den Code wie oben angepasst und dann kommt beim Laden der DLL folgende Meldung:

siehe angehängte Datei

Also im Prinzip wieder fast die gleiche Fehlermeldung wie unter Delphi 7.

Dalai 27. Mär 2014 16:12

AW: DLL bei 64Bit-System wird nicht geladen
 
Und wie hast du das Programm kompiliert bzw. für welche Plattform? Win32 oder Win64? Das ist der entscheidende Faktor.

MfG Dalai

himitsu 27. Mär 2014 16:51

AW: DLL bei 64Bit-System wird nicht geladen
 
Standardmäßig ist das Projekt ja noch 32 Bit und auch eine neue VCL-Anwendung wird erstmal nur für 32 Bit eingerichtet.

In der Projektverwaltung, bei Plattform muß also erstmal das Win64 hinzugefügt und natürlich auch aktiviert werden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:08 Uhr.
Seite 1 von 2  1 2      

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