AGB  ·  Datenschutz  ·  Impressum  







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

DLL nicht automatisch laden

Ein Thema von venice2 · begonnen am 3. Aug 2020 · letzter Beitrag vom 3. Aug 2020
Antwort Antwort
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.621 Beiträge
 
Delphi 12 Athens
 
#1

AW: DLL nicht automatisch laden

  Alt 3. Aug 2020, 11:13
Eine statisch gelinkte DLL wird beim Start der EXE gesucht. Welche Orte dabei durchsucht werden ist irgendwo in der Windows-Doku beschrieben (hab es gerade nicht parat). Das ist übrigens nicht irgendwas von Delphi sondern es ist Windows, das so arbeitet.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#2

AW: DLL nicht automatisch laden

  Alt 3. Aug 2020, 11:15
Eine statisch gelinkte DLL wird beim Start der EXE gesucht. Welche Orte dabei durchsucht werden ist irgendwo in der Windows-Doku beschrieben (hab es gerade nicht parat). Das ist übrigens nicht irgendwas von Delphi sondern es ist Windows, das so arbeitet.
Sie wird auch statisch in C++ gelinkt.
Was soll mir das jetzt sagen.
Es geht mir nicht um den Ort sondern das mein Programm in C++ startet in Delphi aber nicht.
Unabhängig davon wo sich die DLL befindet. Bzw. Nicht vorhanden ist.

C++
1. DLL statisch gelinkt.
2. Funktionen sind im Quellcode aktiv und werden auch aufgerufen.
3. Anwendung startet.
4. Funktionen die aufgerufen werden gehen ins leere wenn das Handle der DLL über LoadLibrary 0 ist.

Delphi
1. DLL statisch gelinkt.
2. Funktionen sind im Quellcode aktiv und werden aufgerufen und starten die DLL automatisch (Warum? )
3. Anwendung startet nicht wenn DLL fehlt
4. Funktionen die aufgerufen werden starten die DLL automatisch ohne das ich LoadLibrary selbst verwende. (Warum? )

Weshalb lädt der Compiler die DLL selbst (bzw. sucht diese) ohne mein Zutun und ignoriert diese nicht einfach so wie es in C++ auch der Fall ist?

Es geht nicht um die Frage statisch oder Dynamisch sondern warum beim statischen linken C++\Delphi so einen unterschied machen.

Geändert von venice2 ( 3. Aug 2020 um 11:56 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.621 Beiträge
 
Delphi 12 Athens
 
#3

AW: DLL nicht automatisch laden

  Alt 3. Aug 2020, 12:03
Weshalb lädt der Compiler die DLL selbst (bzw. sucht diese) ohne mein Zutun und ignoriert diese nicht einfach so wie es in C++ auch der Fall ist?
Der Compiler lädt weder eine DLL nocht sucht er diese - das tut Windows wenn das Programm gestartet wird und noch bevor irgendein OpCode der EXE ausgeführt wird.

Es ist aber auch durchaus möglich, daß statisches Linken in C++ etwas anderes bedeutet als statisches Linken einer DLL in Delphi. Vielleicht werden vom C++ Compiler die externen Routinen statisch in das Programm einkopiert (z.B. aus obj-Dateien oder einer lib-Datei). Dann braucht das C++ Programm die DLL gar nicht da es den Code bereits enthält. Ich bin aber nun mal kein C++ Experte. Deswegen ist das nur eine Vermutung.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#4

AW: DLL nicht automatisch laden

  Alt 3. Aug 2020, 12:08
Zitat:
(z.B. aus obj-Dateien oder einer lib-Datei). Dann braucht das C++ Programm die DLL gar nicht da es den Code bereits enthält.
Danke Uwe für die Infos.

Aber!
Ein ein kompilieren der *.lib bringt in dem Fall gar nichts ohne entsprechender DLL startet die Funktion gar nicht erst.
Aber die Anwendung was in Delphi nicht der Fall ist.

Ich möchte aber nur weil die DLL nicht vorhanden ist nicht alle aufrufe der DLL Funktionen wieder deaktivieren. (ja ich könnte sie Dynamisch laden tue ich aber in C++ auch nicht)
In C++ geht das doch auch.
Und ja selbst getestet.

Zitat:
das tut Windows
Selbst wenn Windows das tut muss es dennoch einen Unterschied geben das es mit C++ funktioniert aber in Delphi nicht.

Aktiviere ich diese Zeile.
Delphi-Quellcode:
      DLL_PROCESS_ATTACH:
       Trace('Trace Init');
Dann wird die DLL automatisch geladen ohne das ich LoadLibrary dafür bemühe.
Das soll sie aber nicht.

Geändert von venice2 ( 3. Aug 2020 um 12:17 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.683 Beiträge
 
Delphi 5 Professional
 
#5

AW: DLL nicht automatisch laden

  Alt 3. Aug 2020, 13:08
So ganz ohne Code (und ggf. Compilerschalter), sowohl für C++ als auch für Delphi, ist das alles nur Rumgerate. Du solltest außerdem mal einen Blick auf die Importtable der EXE schauen, welche DLLs und welche Funktionen sie daraus holt/erfordert - dafür gibt es zahlreiche Programme (ich nutze Total Commander Lister Plugins PE Viewer und FileInfo). Ein Aufruf einer Funktion aus einer externen DLL in Delphi, die nicht delayed; ist und nicht dynamisch per GetProcAddress/LoadLibrary gerufen wird, findet sich immer als erforderlicher Funktionsruf in der Importtabelle wieder - fehlt die DLL, gibt Windows eine entsprechende Meldung, welche DLL fehlt und bricht den Start des Programms ab.

Dr Bob hat eine ganz gute Zusammenfassung der Möglichkeiten und Unterschiede:
http://www.drbob42.com/examines/examinC1.htm

Grüße
Dalai
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#6

AW: DLL nicht automatisch laden

  Alt 3. Aug 2020, 13:12
Zitat:
So ganz ohne Code
Ganz ohne. Hast du ihn für Delphi übersehen?

Eine DLL Dynamisch zu laden ist nicht das Problem und damit geht es auch. (ganz so dumm bin ich dann doch nicht!)
Nur wie gesagt verstehe nicht das es mit einer statisch geladenen DLL in C++ funktioniert und in Delphi halt nicht.

Delphi-Quellcode:
unit Dynamic_Trace;

interface

uses Windows;

const
  dllfile = 'Tracer.dll';

var
  TRACE_Handle: Thandle = 0;
  Trace_Loaded: Bool = false;

  Trace: function(Msg: PWideChar): LongInt; stdcall;

function Load_TRACEDLL(const dllfilename: string): BOOL;
procedure Unload_TRACEDLL;

implementation

function Load_TRACEDLL(const dllfilename: string): BOOL;
var
  oldmode: integer;
begin
  if TRACE_Handle <> 0 then
    Result := true
  else
  begin
    oldmode := SetErrorMode($8001);
    TRACE_Handle := LoadLibrary(PWideChar(dllfilename));
    SetErrorMode(oldmode);
    if TRACE_Handle <> 0 then
    begin
      @Trace := GetProcAddress(TRACE_Handle, PAnsiChar('Trace'));
      if (@Trace = nil) then
      begin
        FreeLibrary(TRACE_Handle);
        TRACE_Handle := 0;
      end;
    end;
    Result := (TRACE_Handle <> 0);
  end;

end;

procedure Unload_TRACEDLL;
var
  HWND: DWord;
begin
  if TRACE_Handle <> 0 then
  begin
    HWND := FindWindow('TRACER', 'TRACER');
    if HWND <> 0 then
    begin
      TRACE_Handle := SendMessage(HWND, WM_DESTROY, 0, 0);
      Trace_Loaded := false;
    end else
    begin
      TRACE_Handle := 0;
      Trace_Loaded := false;
    end;
  end;
end;

end.
Delphi-Quellcode:
  if UseDebug then
  begin
    if not Trace_Loaded then
    begin
      Trace_Loaded := Load_TRACEDLL(ExtractFilePath(paramstr(0)) +
        dllfile);
      if Trace_Loaded then
      begin
        Trace('');
        repeat
          HWND := FindWindow('TRACER', 'TRACER');
          WinprocessMessages;
        until HWND <> 0;
      end;
    end;
  end;
Und der Aufruf.

Delphi-Quellcode:
if Trace_Loaded then
  Trace(PWideChar('Init ' + 'Value = ' + BoolToStr(bInit)));
So startet die Anwendung auch wenn die DLL nicht existiert.

Aber meine Frage ist damit nicht beantwortet denn ich verwende so Dynamisches und kein statisches laden.

Geändert von venice2 ( 3. Aug 2020 um 14:22 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.332 Beiträge
 
Delphi 12 Athens
 
#7

AW: DLL nicht automatisch laden

  Alt 3. Aug 2020, 13:34
Statisches Linken (im Delphi/Windows), da wird der Link in die Import-Tabelle des PE-Headers eingetragen,
welche von Windows gefüllt wird, bevor der ProgrammCode anfängt mit Arbeiten.

Beim Delayed-Loading gibt es auch diese "statische" Tabelle,
aber die ist zu Beginn mit Dummyprozeduren gefüllt.
Und erst beim Aufruf einer dieser Prozeduren wird die DLL geladen und die Tabelle mit den richtigen Zeigern gefüllt.
https://docs.microsoft.com/de-de/cpp...s?view=vs-2019
http://docwiki.embarcadero.com/RADSt...indows-only.29

Beim dynamischen Laden führt der Entwickler das LoadLibrary aus und sucht via GetProcAddress seine Methoden und speichert sie in eigenen Variablen.



Für Windows ist Delayed-Loading beim Programmcode viel "schöner",
wenn man damit leben kann, dass Microsoft hier eine echt besch*** Fehlermeldung eingebaut hat, wenn das Laden fehlschlägt, sollte die DLL/Funktion fehlen.
Außerdem wurde im Delphi das Entladen nicht implementiert.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 3. Aug 2020 um 13:40 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.683 Beiträge
 
Delphi 5 Professional
 
#8

AW: DLL nicht automatisch laden

  Alt 3. Aug 2020, 13:48
Zitat:
So ganz ohne Code
Ganz ohne. Hast du ihn für Delphi übersehen?
Ich korrigiere: Mit nur der Hälfte des notwendigen Codes. Wenn du sagst, mit Delphi geht etwas nicht, mit C++ (mit welchem überhaupt, und welcher Compiler?) aber schon, du aber nur Delphi-Code zeigst, kann keiner eine sinnvolle fundierte Antwort geben, wo genau der Unterschied ist. Nur Vermutungen sind möglich, und Empfehlungen wie z.B. meine mit dem Blick auf die Importtabelle.

Soweit ich weiß bedeutet statisches Linken bei C++, dass die DLLs ins Programm (also in die EXE) einkompiliert werden. Das macht sich dann natürlich bei der Größe bemerkbar.

Grüße
Dalai

Geändert von Dalai ( 3. Aug 2020 um 13:52 Uhr)
  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 15:25 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz