Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Problem mit dynamisch geladener DLL (https://www.delphipraxis.net/84919-problem-mit-dynamisch-geladener-dll.html)

cruiser 23. Jan 2007 16:15


Problem mit dynamisch geladener DLL
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo.

Ich habe mir das lange schon vorgenommen und endlich auch umgesetzt. Eine Unit, die eine DLL kapselt von statisch auf dynamisch umstellen. Das zuweisen der Prozeduren scheint auch zu funktionieren, zumindest sieht es dannach aus. Solange die DLL im Programmverzeichnis liegt oder in den Suchpfaden arbeitet es tadellos. Liegt sie aber (wie ich es gern will) optional im Temp-Verzeichnis lädt es die DLL nicht, obwohl ich dafür eine extra Routine im initialization gebastelt hab. ich hab bereits sämtliche DCU's gelöscht und das Package dem die Unit angehört neu kompiliert. Es bringt alles nichts. Vielleicht habt ihr dazu ja eine Idee. Die Datei ist angehängt. Vielen Dank schon mal im Voraus.

sh17 23. Jan 2007 16:33

Re: Problem mit dynamisch geladener DLL
 
Wie ist denn GetTempDir definiert? hat der zurück gegebene Pfad den Pfadtrenner \ oder nicht?

cruiser 23. Jan 2007 19:12

Re: Problem mit dynamisch geladener DLL
 
Die ist aus der CodeLib und hat den Trenner... hab schon ne Box werfen lassen..

cruiser 25. Jan 2007 14:48

Re: Problem mit dynamisch geladener DLL
 
Ich pushe nur ungern, aber hat da jemand mehr Ahnung? Ich verzweifel langsam. Kann es sein, dass es am absoluten Pfad liegt? (Bei mir kommt da der String 'D:\Users\Temp\lib...dll' raus, hab den dll-Namen nich im Kopf ;) )

SirThornberry 25. Jan 2007 14:51

Re: Problem mit dynamisch geladener DLL
 
hast du schonmal mit FileExists geprüft ob die Datei auch wirklcih gefunden wird?

Luckie 25. Jan 2007 14:55

Re: Problem mit dynamisch geladener DLL
 
Wenn die DLL da liegt, dann sollte sie auch geladen werden. Mach mal:
Delphi-Quellcode:
  if FileExists(GetTempDir + 'libeay32.dll') then
  begin
    hLib := LoadLibrary(PChar(GetTempDir + 'libeay32.dll'))
    if hLib = INVALID_HANDLE_VALUE then
      MessageBox(0, PChar(SysErrorMessage(GetLastError)), 'LoadLibrary', 0);
  end
  else
    MessageBox(0, PChar(Format('Datei nicht in %s gefunden', [GetTempDir])), 'FileExistst', 0);
Dann sollten wir mehr wissen.

cruiser 25. Jan 2007 14:56

Re: Problem mit dynamisch geladener DLL
 
Das ist ja ge nau so drin... hm... ich poste mal den initialization-Teil:

GetTempDir feuer bei mir den string 'D:\Users\Temp\' raus.
hLib ist im Implementation als var hLib: cardinal; deklariert

Delphi-Quellcode:
initialization

  if FileExists(GetTempDir + 'libeay32.dll')
  then
    hLib := LoadLibrary(PChar(GetTempDir + 'libeay32.dll'))
  else
    hLib := LoadLibrary('libeay32.dll');



    if hLib <> 0 then
    begin
      @BN_new := GetProcAddress(hLib, 'BN_new');
      @BN_init := GetProcAddress(hLib, 'BN_init');
      @BN_clear_free := GetProcAddress(hLib, 'BN_clear_free');
      @BN_free := GetProcAddress(hLib, 'BN_free');
      @BN_rand := GetProcAddress(hLib, 'BN_rand');
      @BN_num_bits := GetProcAddress(hLib, 'BN_num_bits');
      @BN_bin2bn := GetProcAddress(hLib, 'BN_bin2bn');
      @BN_bn2bin := GetProcAddress(hLib, 'BN_bn2bin');
      @BN_hex2bn := GetProcAddress(hLib, 'BN_hex2bn');
      @BN_bn2hex := GetProcAddress(hLib, 'BN_bn2hex');
      @BN_is_bit_set := GetProcAddress(hLib, 'BN_is_bit_set');
      @BN_cmp := GetProcAddress(hLib, 'BN_cmp');
      @BN_set_word := GetProcAddress(hLib, 'BN_set_word');
      @BN_lshift := GetProcAddress(hLib, 'BN_lshift');
      @BN_add_word := GetProcAddress(hLib, 'BN_add_word');
    end;

finalization

  FreeLibrary(hLib);

end.
hrm... wird evtl. das finalization zu früh getriggert?

Luckie 25. Jan 2007 15:08

Re: Problem mit dynamisch geladener DLL
 
Push, falls du mein Posting übersehen haben solltest.

cruiser 25. Jan 2007 15:12

Re: Problem mit dynamisch geladener DLL
 
Sorry, Leute... hab es gefunden... die Frickler, die das verbrochen habn, haben noch in andren files die Datei benutzt ;) also noch mehr anpassen. Danke euch trotzdem.

Und danke Lucky... durch deine Möglichkeit hab ich bemerkt, dass meine modifizierte Datei die DLL im Temp definitiv findet

Luckie 25. Jan 2007 15:15

Re: Problem mit dynamisch geladener DLL
 
Solch eine Fehlerbehandlung solltest du zu mindest beim Entwickeln zum Debuggen immer einbauen. Und zum Schluss noch für den Anwender, damit der weiß, was los ist und dir einen entsprechende Fehlerbericht geben kann, sonst kommt bei dir nur an: "Geht nicht." und damit kannst du dann auch nichts anfangen.

cruiser 25. Jan 2007 15:19

Re: Problem mit dynamisch geladener DLL
 
Jap. Ich werd (mit deiner Erlaubnis) diese Methode überall da wo es nötig ist einbauen. Oder ist es besser alle Proceduren in einer Loader-Unit zu kapseln und die uses zu ersetzen?

Luckie 25. Jan 2007 15:27

Re: Problem mit dynamisch geladener DLL
 
Ich würde die Messageboxen aus der Unit rausnehmen und besser so was machen:

Delphi-Quellcode:
function Load: Boolean;
begin
  hLib := LoadLibrary(...)
  result := hLib <> 0;
end;
und beim Aufrufen dann:
Delphi-Quellcode:
if not Load then
  MessageBox(Handle, PChar(SysErrorMessage(GetLastError)), 'Fehler - DLL laden', MB_ICONSTOP);
else
  ...;
Dann kannst du je nach dem entscheiden, ob du eine Fehlermeldung an der Stelle willst oder nicht. Oder du machst es mit Exceptions, wenn dir das lieber ist:
Delphi-Quellcode:
function Load: Boolean;
begin
  hLib := LoadLibrary(...)
  if hLib = 0 then
    raise Exception.Create(SysErrorMessage(GetLastError));
end;
Delphi-Quellcode:
  try
    Load;
  except
    on E: Exception do
      MessageBox(Handle, PChar(E.Message), 'Fehler - DLL laden', MB_ICONSTOP);
  end;

cruiser 25. Jan 2007 15:32

Re: Problem mit dynamisch geladener DLL
 
mhm... gute Idee. Vielleicht eher unwichtige Frage... aber... DLL nur in einer Unit laden und Uses anpassen oder in jeder unit die Externals austauschen? Was wäre da günstiger?


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:39 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